1、首先要在你的Laravel项目中安装Google验证器插件、二维码生成器插件,执行命令如下:
# Google验证器插件安装命令:
composer require "earnp/laravel-google-authenticator:dev-master"
# 二维码生成器:
composer require simplesoftwareio/simple-qrcode 1.3.*
安装完成后,会自动在composer.json文件中加入版本信息,如果没有成功,手动添加,再执行,如下图所示:
2、扩展安装后,结构如下图所示:
3、安装完成后,在config/app.php中注册服务提供者同时注册下相应门面,代码如下:
'providers' => [
/*
* Laravel Framework Service Providers...
*/
... ... ... ...
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
// Google验证器
Earnp\GoogleAuthenticator\GoogleAuthenticatorServiceprovider::class,
// 二维码生成器
SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class,
],
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
'Blade' => Illuminate\Support\Facades\Blade::class,
... ... ... ... ...
// 谷歌验证器
'Google' => Earnp\GoogleAuthenticator\Facades\GoogleAuthenticator::class,
// 二维码生成器
'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class
],
4、html代码:
<div class="modal-body col-sm-4">
<div class="box-header">
<h3 class="box-title">Google验证器设置</h3>
</div>
<div class="box-header">
<label class="control-label" for="google_status">谷歌验证器:</label>
<label>
<input name="google_status" type="radio" value="1" @if($user->google_status === 1) checked @endif class="on" />启用
</label>
<label> </label>
<label>
<input type="radio" name="google_status" value="0" @if($user->google_status === 0) checked @endif class="off" />禁用
</label>
</div>
<div class="form-hide box-header" style="display: none">
<label class="control-label" for="secret">验证器秘钥:</label>
<label><input type="text" class="form-control " name="secret" id="secret" value="{{$google['secret']}}" readonly="true"></label>
<div class="modal-body text-center">
<label class="control-label"></label>
<?php echo $google['qrcode'] ?>
</div>
</div>
<div class="box-header">
<button type="submit" class="pretty-btn">提交</button>
</div>
</div>
5、JQuery代码:
<script>
$(document).ready(function () {
$('#system').addClass('active');
$('#change_password').addClass('active');
// 点击事件(开启、关闭谷歌验证器)
$(".on").click(function(e) {
$(".form-hide").show().removeClass("show");
});
$(".off").click(function(e) {
$(".form-hide").hide().removeClass("show");
});
});
</script>
6、PHP代码 (首先引入GoogleAuthenticator.php、QrCode.php这2个文件):
use Earnp\GoogleAuthenticator\GoogleAuthenticator; use SimpleSoftwareIO\QrCode\Facades\QrCode;
/**
* 账号管理
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function merchant_account(){
$user = $this->getUser();
// 判断该用户是否已经存在google秘钥、没有重新生成
if (empty($user['secret']) && $user['google_status'] === 0) {
// 获取google秘钥
$google = GoogleAuthenticator::CreateSecret();
// 生成二维码
$google["qrcode"] = QrCode::encoding('UTF-8')->size(180)->margin(1)->generate($google["codeurl"]);
} else {
$google['secret'] = $user['secret'];
$google_url = "otpauth://totp/?secret=" . $user['secret'];
// 生成二维码
$google["qrcode"] = QrCode::encoding('UTF-8')->size(180)->margin(1)->generate($google_url);
}
return view('merchant.system.merchant_account',compact('user','google'));
}
/**
* 账号管理处理方法
* @param Request $request
* @return \Illuminate\Http\RedirectResponse
* @throws ErrorMessageException
*/
public function merchant_account_do(Request $request){
if($request->isMethod('post')){
$param = $request->all();
$user=$this->getUser();
if (empty($user['secret'])) {
$user->secret = $param['secret'];
$user->google_status = $param['google_status'];
}else{
$user->google_status = $param['google_status'];
}
if ($user->save()) {
return redirect()->back()->with('msg', 'Google验证器设置成功!');
} else {
throw new ErrorMessageException("Google验证器设置失败!");
}
}
}
7、效果图如下:
8、开启后,登录需要输入Google验证码:
则,在登录方法里,将用户输入的Google验证码与用户秘钥进行匹配,代码如下:
/**
* 重写登录成功回应
* Google 验证
* @param Request $request
* @return \Illuminate\Http\RedirectResponse
* @throws \App\Exceptions\ErrorMessageException
*/
public function sendLoginResponse(Request $request){
$param = Request()->all();
$user = $this->getUser();
// 判断该用户是否开启google验证
// 将用户输入的验证码与秘钥进行匹配
if(1 === $user['google_status']){
// Google验证码与秘钥进行匹配
if(!GoogleAuthenticator::CheckCode($user['secret'],$param['secret'])){
throw ValidationException::withMessages([
$this->username() => [trans('auth.secret')],
]);
}
}
UserIp::create([
'user_id' => $this->getUser()->id,
'ip' => $request->ip(),
]);
$request->session()->regenerate();
$this->clearLoginAttempts($request);
return $this->authenticated($request, $this->guard()->user())
?: redirect()->intended($this->redirectPath());
}
匹配成功,成功登录、匹配失败,友好提示!
希望能帮到大家,同事也为自己做笔记,不喜勿喷!