編者語
第一次看到簡書上的驗(yàn)證碼鸯屿,簡直高大上,很是羨慕把敢。但今日在看了laravelacadmy寄摆,laravel學(xué)院的時(shí)候,看到一片文章《極驗(yàn)(Geetest)修赞,讓驗(yàn)證更安全》婶恼,講的就是滑動驗(yàn)證碼,于是開始試驗(yàn)柏副,在入坑多次之后勾邦,終于試驗(yàn)成功。于是割择,就寫這份筆記眷篇,以便以后的使用。
開始
注冊極簡帳號:http://account.geetest.com/
添加一個驗(yàn)證铅歼,獲取一個ID和KEY公壤。
Laravel部署
- 安裝一個Laravel的極簡驗(yàn)證的集成包
composer require germey/geetest
- 注冊服務(wù)與設(shè)置別名(
config/app.php
)
于provider數(shù)組中添加服務(wù)
Germey\Geetest\GeetestServiceProvider::class
,
于aliases數(shù)組中添加,
'Geetest' => Germey\Geetest\Geetest::class,
- 配置ID和KEY
可以在.env
中配置椎椰,也可以在config/geetest.php
中配置厦幅。筆者是在.env
中添加了兩行信息,如下:
GEETEST_ID=獲取的ID
GEETEST_KEY=獲取的KEY
- 密鑰的生成地址
驗(yàn)證碼的生成步驟:當(dāng)加載登陸頁面時(shí)慨飘,會自執(zhí)行ajax請求一個后臺的地址确憨,會在后臺生成一個密鑰,返回給前臺瓤的,前臺會依據(jù)此密鑰再去請求Geetes
t的一個接口休弃,依據(jù)Geetest
返回的信息生成驗(yàn)證碼。
這個后臺的地址默認(rèn)為/auth/geetest
圈膏;所以你需要在Auth控制器中進(jìn)行相應(yīng)的配置塔猾。
# AuthController.php
use Germey\Geetest\CaptchaGeetest;
class AuthController extends Controller
{
use CaptchaGeetest;
......
}
有人可能納悶使用的CaptchaGeetest.php
文件到底是什么?它其實(shí)就是一個可以繼承的一個方法稽坤,trait
大大提高了代碼的重用性丈甸,他可以放在任何類中。如下所示尿褪。
# CaptchaGeetest.php
<?php namespace Germey\Geetest;
trait CaptchaGeetest
{
/**
* Get geetest.
*/
public function getGeetest()
{
$user_id = "test";
$status = Geetest::preProcess($user_id);
session()->put('gtserver', $status);
session()->put('user_id', $user_id);
echo Geetest::getResponseStr();
}
}
請求地址/auth/geetest
可以在config/geetest.php
進(jìn)行查看和修改睦擂。
- 路由設(shè)置
默認(rèn)請求地址為/auth/geetest
,那么我們的路由就這樣設(shè)置杖玲。
Route::get('auth/geetest','Auth\AuthController@getGeetest');
當(dāng)然顿仇,我們也可以進(jìn)行更改默認(rèn)的訪問地址和默認(rèn)使用的控制器。
- 后臺的復(fù)核驗(yàn)證
這個驗(yàn)證碼的驗(yàn)證會在前臺進(jìn)行自動驗(yàn)證摆马,這個無需管臼闻。但為了更安全,我們可以在后臺進(jìn)行二次驗(yàn)證囤采。筆者重新建立一個控制器些阅,用于做驗(yàn)證。
# 前臺模板
<div class="content">
<h1>極簡后端測試</h1>
<form action="/login" method="post">
<input name="_token" type="hidden" value="{{ csrf_token() }}">
帳號:<input type="text" name="name"><br><br>
密碼:<input type="password" name="password"><br><br>
{!! Geetest::render('embed') !!} <br><br>
<input type="submit" value="submit">
</form>
</div>
# LoginController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use Illuminate\Support\Facades\Config;
class LoginController extends Controller
{
public function index(Request $request)
{
$result = $this->validate(
$request,
['geetest_challenge' => 'geetest'],
['geetest' => Config::get('geetest.server_fail_alert')]
);
if ($request) {
return 'success';
}
}
}
利用 validate 方法斑唬,通過驗(yàn)證其中一個字段 geetest_challenge, 驗(yàn)證規(guī)則 geetest 就可以完成服務(wù)端的驗(yàn)證市埋。這樣就更保證了安全性。
在這里注意恕刘,由于多提交了幾個字段缤谎,如果想執(zhí)行 ORM 的批量插入修改操作時(shí),記得在 Model 里面屏蔽這幾個字段
protected $guarded = ['geetest_challenge', 'geetest_validate', 'geetest_seccode'];
當(dāng)然褐着,還包含多種驗(yàn)證坷澡,筆者沒再一一測試,如果想要更多學(xué)習(xí)含蓉,可以參考官方文檔频敛。