• Laravel 下实现 Google 2fa 验证


    最近有个项目需要用到 Google 2fa 验证,第一次接触,跟着教程来做!

    1.首先安装 Google 2fa

    composer require pragmarx/google2fa-laravel

    安装完后,我显示的默认版本是2.0  "pragmarx/google2fa-laravel": "^2.0",

    2.配置 Google 2fa

    在config/app.php

    1. PragmaRX\Google2FALaravel\ServiceProvider::class,
    2. 'Google2FA' => PragmaRX\Google2FALaravel\Facade::class,

    3.生成 Google2fa 的配置文件

    php artisan vendor:publish --provider="PragmaRX\Google2FALaravel\ServiceProvider"

    然后就会发现在config 里面多了 google2fa.php 的文件,我所有配置都是用默认值,没有修改。

    接下来就是调用

    1.打开Kernel.php 文件,在$routeMiddleware 中加入google2fa 中间件,如下

    1. protected $routeMiddleware = [
    2. 'auth' => \App\Http\Middleware\Authenticate::class,
    3. .....
    4. '2fa' => \PragmaRX\Google2FALaravel\Middleware::class,
    5. ];

    ‘2fa’ 就是中间件,根据路径打开文件,代码如下:

    1. namespace PragmaRX\Google2FALaravel;
    2. use Closure;
    3. use PragmaRX\Google2FALaravel\Support\Authenticator;
    4. class Middleware
    5. {
    6. public function handle($request, Closure $next)
    7. {
    8. $authenticator = app(Authenticator::class)->boot($request);
    9. if ($authenticator->isAuthenticated()) {
    10. return $next($request);
    11. }
    12. return $authenticator->makeRequestOneTimePasswordResponse();
    13. }
    14. }

    可以看出,这里有个方法isAuthenticated(),这是用来判断是否属于有通过 google2fa 的登录验证

    2.创建google2fa 登录界面

    首页打开config/google2fa.php 在里面找到这个

    1. /*
    2. * One Time Password View.
    3. */
    4. 'view' => 'admin.google2fa.index',

    这是配置登录页面的路径,这是默认的,当然也可以自定义

    这是我的登录页面的样式,代码就不公布

     因为最终的是6位数的验证码,所以这里密码也是6位

    3.  generateSecretKey

    在用户表中(我的用户表名是user),新增一个字段 google2fa_secret,这是用于保存用户的secret_key,secret_key的作用下面会说的

    生成 secret_key 的代码如下:

    1. $google2fa = new Google2FA();
    2. $google2fa->generateSecretKey();

    将返回值保存到user的google2fa_secret 字段就可以了!

    4.使用app Authenticator  绑定user

    我的做法是这样的,

    首先生成一个URL,这是google2fa自带的方法,

    然后根据这个URL 再生成一个二维码,

    最后使用 Authenticator 扫描这个二维码,执行绑定。 代码如下

    1. $google2fa = new Google2FA();
    2. $qrCodeUrl = $google2fa->getQRCodeUrl(getenv('APP_NAME'),$user->email,$user->google2fa_secret);
    3. $qrcode = QrCode::size(200)->margin(0)->generate($qrCodeUrl);

    getQRCodeUrl 的对应参数是这样:

    getQRCodeUrl($companyName,$companyEmail,$secretKey

    $secretKey 是刚才生成secret_key,至于Qrcode 是我之前安装好的生成二维码的方法,安装及使用方法我其他文章有写,这里不重复,当然也可以使用其他生成二维码的插件

    5.创建 GoogleTokenController.php

    主要作用是验证提交上来的验证码是否正确,代码如下:

    1. <?php
    2. namespace App\Http\Controllers;
    3. use App\Http\Controllers\CommonController;
    4. use Illuminate\Http\Request;
    5. // use PragmaRX\Google2FA\Google2FA;
    6. use Google2FA;
    7. use Auth;
    8. use QrCode;
    9. use App\User;
    10. use Illuminate\Support\Facades\Session;
    11. use PragmaRX\Google2FALaravel\Support\Authenticator;
    12. use Lang;
    13. class GoogleTokenController extends CommonController
    14. {
    15. /**
    16. * Create a new controller instance.
    17. *
    18. * @return void
    19. */
    20. public function __construct()
    21. {
    22. //这是经过第一次login,使用了laravel的 Auth::login 来记录用户是否登录了
    23. $this->middleware('auth');
    24. }
    25. public function authenticate(Request $request){
    26. //判断第一次是否有登录
    27. if(Auth::check()){
    28. $verify_code = $request->input('verify_code');
    29. //判断user_id 是否合法
    30. $user = User::where('id',Auth::user()->id)->where('status',1)->first();
    31. $google2fa = app('pragmarx.google2fa');
    32. //验证 验证码 是否正确
    33. $valid = $google2fa->verifyKey($user->google2fa_secret, $verify_code);
    34. if($valid){
    35. login 持久层,和Auth:login() 是相似的,执行后,就可以通过g2fa 中间件
    36. (new Authenticator(request()))->login();
    37. }else{
    38. $request->session()->flash('status', 'error');
    39. $request->session()->flash('msg', Lang::get('messages.verification_code_error'));
    40. }
    41. return redirect('/home');
    42. }
    43. }
    44. }

    6.Controller 中添加中间件

    1. public function __construct()
    2. {
    3. $this->middleware(array('auth','2fa'));
    4. }

    在有需要的Controller 中添中间件,auth 是laravel 自带的 登录中间件, 2fa 就是刚才添加的 google2fa的中间件,分别是验证第一次登录和第二次登录

    现在基本已经完成了,再重新整理一次流程

    1.安装和配置插件

    2.创建新用户时候添加 secret_key

    3.生成二维码,用 Authenticator  绑定这用户

    4.Authenticator 中点击用户,会生成6位数的验证码,填入登录页面提交验证

    完成

    具体的详细方法,在下载完插件后,里面有个README.md ,位置在这:vendor\pragmarx\google2fa-laravel

    教程唯一没说的是 这行代码,我在网上找了很久才找到

    (new Authenticator(request()))->login();   

    实现google2fa 登录的持久化

  • 相关阅读:
    赞!优雅的Python多环境管理神器!易上手易操作!
    Sqlite 安装操作使用
    【MySQL】(六)DQL表查询操作
    惊险的十天
    【研究生学术英语读写教程翻译 中国科学院大学Unit2】
    每日一题:vue3自定义指令大全(呕心沥血所作,附可运行项目源码)
    OpenGL ES freeglut 下载和使用
    Python数据分析与机器学习20- 逻辑回归项目实战4-模型评估方法:混淆矩阵
    JAVA构造方法(与类名相同的方法),类方法与实例方法
    【JavaWeb】
  • 原文地址:https://blog.csdn.net/winson20102010/article/details/127192890