Menu

89.人机验证(一)

本节说明

  • 对应视频教程第 89 小节:Recaptcha

本节内容

在之前,我们为了防止恶意程序自动发布话题而建立了关键词检测机制,在本节我们再为新建话题动作引入人机验证机制。我们将利用谷歌提供的 reCAPTCHA 来为我们的应用引入人机验证机制。首先我们需要登录,并注册 reCAPTCHA sites:
file
注册后,我们根据说明步骤依次进行。首先我们需要增加 reChaptcha 配置:
forum.env

.
.
RECAPTCHA_KEY=6LdpvGEUAAAAAKwswR10hSWgVT1ehMUeQkW50jni
RECAPTCHA_SECRET=6LdpvGEUAAAAALIvpi13rOcothX8L4xBtEQmxyP8

forum\config\services.php

'recaptcha' => [
        'secret' => env('RECAPTCHA_SECRET')
    ]

];

接着我们修改模板,引入script和人机验证区域:

@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

现在我们进入新建话题页面:
file

然后我们接收前端的数据,后端发送 HTTP 请求进行人机验证。我们利用 Zttp 来发送请求。ZttpAdam Wathan 为了让代码更富表现力以及简化常见用例而写的一个 Guzzle 的封装。我们来安装它:

$ composer require kitetail/zttp

修改控制器代码,增加人机验证:
forum\app\Http\Controllers\ThreadsController.php

    .
    .
    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']
        ]);
        .
        .
    }
    .
    .

如果我们不进行人机验证直接发布话题,则会报错:
file
进行了人机验证之后再发布话题:
file

本文章首发在 Laravel China 社区
上一篇 下一篇
讨论数量: 0
发起讨论


暂无话题~
刻意练习,每日精进。
1
点赞
64
浏览
0
讨论

维护者