89.人机验证(一)
- 本系列文章为
laracasts.com
的系列视频教程——Let's Build A Forum with Laravel and TDD 的学习笔记。若喜欢该系列视频,可去该网站订阅后下载该系列视频, 支持正版 ;- 视频源码地址:github.com/laracasts/Lets-Build-a-...;
- 本项目为一个 forum(论坛)项目,与本站的第二本实战教程 《Laravel 教程 - Web 开发实战进阶》 类似,可互相参照。
本节说明
- 对应视频教程第 89 小节:Recaptcha
本节内容
在之前,我们为了防止恶意程序自动发布话题而建立了关键词检测机制,在本节我们再为新建话题动作引入人机验证机制。我们将利用谷歌提供的 reCAPTCHA 来为我们的应用引入人机验证机制。首先我们需要登录,并注册 reCAPTCHA sites:
注册后,我们根据说明步骤依次进行。首先我们需要增加 reChaptcha 配置:
forum.env
.
.
RECAPTCHA_KEY=6LdpvGEUAAAAAKwswR10hSWgVT1ehMUeQkW50jni
RECAPTCHA_SECRET=6LdpvGEUAAAAALIvpi13rOcothX8L4xBtEQmxyP8
forum\config\services.php
'recaptcha' => [
'secret' => env('RECAPTCHA_SECRET')
]
];
接着我们修改模板,引入script
和人机验证区域:
forum\resources\views\threads\create.blade.php
@extends('layouts.app')
@section('header')
<script src='https://www.google.com/recaptcha/api.js'></script>
@endsection
@section('content')
.
.
<div class="form-group">
<div class="g-recaptcha" data-sitekey="6LdpvGEUAAAAAKwswR10hSWgVT1ehMUeQkW50jni"></div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Publish</button>
</div>
.
.
@endsection
现在我们进入新建话题页面:
然后我们接收前端的数据,后端发送 HTTP 请求进行人机验证。我们利用 Zttp 来发送请求。Zttp 是 Adam Wathan 为了让代码更富表现力以及简化常见用例而写的一个 Guzzle 的封装。我们来安装它:
$ composer require kitetail/zttp
修改控制器代码,增加人机验证:
forum\app\Http\Controllers\ThreadsController.php
.
use Zttp\Zttp;
.
.
public function store(Request $request)
{
$this->validate($request,[
'title' => 'required|spamfree',
'body' => 'required|spamfree',
'channel_id' => 'required|exists:channels,id'
]);
$response = Zttp::asFormParams()->post('https://www.google.com/recaptcha/api/siteverify',[
'secret' => config('services.recaptcha.secret'),
'response' => $request->input('g-recaptcha-response'),
'remoteip' => $_SERVER['REMOTE_ADDR']
]);
if (! $response->json()['success']) {
throw new \Exception('Recaptcha failed');
}
.
.
}
.
.
如果我们不进行人机验证直接发布话题,则会报错:
进行了人机验证之后再发布话题: