IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> Laravel 下实现 Google 2fa 验证 -> 正文阅读

[PHP知识库]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

PragmaRX\Google2FALaravel\ServiceProvider::class,

'Google2FA' => PragmaRX\Google2FALaravel\Facade::class,

3.生成 Google2fa 的配置文件

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

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

接下来就是调用

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

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

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

<?php

namespace PragmaRX\Google2FALaravel;

use Closure;
use PragmaRX\Google2FALaravel\Support\Authenticator;

class Middleware
{
    public function handle($request, Closure $next)
    {
        $authenticator = app(Authenticator::class)->boot($request);

        if ($authenticator->isAuthenticated()) {
            return $next($request);
        }

        return $authenticator->makeRequestOneTimePasswordResponse();
    }
}

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

2.创建google2fa 登录界面

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

    /*
     * One Time Password View.
     */
    'view' => 'admin.google2fa.index',

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

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

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

3. ?generateSecretKey

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

生成?secret_key 的代码如下:

$google2fa = new Google2FA();
$google2fa->generateSecretKey();

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

4.使用app Authenticator? 绑定user

我的做法是这样的,

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

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

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

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

getQRCodeUrl 的对应参数是这样:

getQRCodeUrl($companyName,$companyEmail,$secretKey)

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

5.创建?GoogleTokenController.php

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

<?php
namespace App\Http\Controllers;

use App\Http\Controllers\CommonController;
use Illuminate\Http\Request;
// use PragmaRX\Google2FA\Google2FA;
use Google2FA;
use Auth;
use QrCode;
use App\User;
use Illuminate\Support\Facades\Session;
use PragmaRX\Google2FALaravel\Support\Authenticator;
use Lang;


class GoogleTokenController extends CommonController
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //这是经过第一次login,使用了laravel的 Auth::login 来记录用户是否登录了
        $this->middleware('auth');
    }

    public function authenticate(Request $request){
        //判断第一次是否有登录
        if(Auth::check()){
            $verify_code = $request->input('verify_code');
            //判断user_id 是否合法
            $user = User::where('id',Auth::user()->id)->where('status',1)->first();
            $google2fa = app('pragmarx.google2fa');
            //验证 验证码 是否正确
            $valid = $google2fa->verifyKey($user->google2fa_secret, $verify_code);
            if($valid){
                login 持久层,和Auth:login() 是相似的,执行后,就可以通过g2fa 中间件
                (new Authenticator(request()))->login();               
            }else{
                $request->session()->flash('status', 'error');
                $request->session()->flash('msg', Lang::get('messages.verification_code_error'));
            }
            return redirect('/home');
        }
    }





}

6.Controller 中添加中间件

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

在有需要的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 登录的持久化

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章           查看所有文章
加:2022-11-05 00:06:00  更:2022-11-05 00:06:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/26 15:13:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码