最近有个项目需要用到 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 登录的持久化
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97961.html