biscolab / laravel-recaptcha
为 Laravel 框架提供的简单易用的 Google reCAPTCHA 包
Requires
- php: ^7.3|^8.0
- illuminate/routing: ^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- orchestra/testbench: 5.*|6.*|^7.0|^8.0|^9.0
- phpunit/phpunit: ^9.1|^10.5
Suggests
- biscolab/laravel-authlog: It allows to handle logged-in users and force log-out if needed
- dev-master
- v6.1.0
- v6.0.0
- v5.4.0
- v5.3.0
- 5.2.0
- 5.1.0
- 5.0.1
- 5.0.0
- 4.4.0
- 4.2.0
- 4.1.0
- 4.0.1
- 4.0.0
- v3.6.1
- v3.6.0
- v3.5.0
- v3.4.2
- v3.4.1
- v3.4.0
- v3.3.0
- v3.2.0
- v3.1.0
- v3.0.2
- v3.0.1
- v3.0.0
- v2.x-dev
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v2.0.0-beta
- v1.x-dev
- v1.0.1
- v1.0.0
- dev-release/v5
- dev-release/v4
- dev-release/v3
This package is auto-updated.
Last update: 2024-06-27 11:42:56 UTC
README
Laravel ReCAPTCHA 是一个非常简单易用的 Laravel 5 包,用于在您的应用程序中嵌入 Google reCAPTCHA。
什么是 reCAPTCHA?
谷歌开发者说:“reCAPTCHA 可以保护您免受垃圾邮件和其他类型的自动化滥用。在这里,我们解释如何将 reCAPTCHA 添加到您的网站或应用程序。”
您可以在 Google reCAPTCHA 开发者指南 中找到更多信息
reCAPTCHA 可用版本
目前有 3 个版本可用(适用于 Web 应用程序)
- v3,最新版本(reCAPTCHA v3)
- v2 检查框 或简单称为 reCAPTCHA v2(reCAPTCHA v2)
- v2 无痕(无痕 reCAPTCHA)
首先获取您的密钥!
首先,您需要在 这里 创建自己的 API 密钥
按照说明操作,并在过程结束时,您将找到 网站密钥 和 密钥密钥。请妥善保管它们,您很快就会用到!
系统要求
包版本 | reCaptcha 版本 | PHP 版本 | Laravel 版本 |
---|---|---|---|
6.1 | v3,v2 无痕,v2 检查框 | 7.3 或更高 | 7, 8, 9, 10, 11 |
6.0 | v3,v2 无痕,v2 检查框 | 7.3 或更高 | 7, 8, 9, 10 |
5.x | v3,v2 无痕,v2 检查框 | 7.3 或更高 | 7, 8, 9 |
4.2.x 到 4.4.x | v3,v2 无痕,v2 检查框 | 7.1 或更高 | 5.5 或更高,6,7,8 |
4.1.x | v3,v2 无痕,v2 检查框 | 7.1 或更高 | 5.5 或更高,6,7 |
4.0.x | v3,v2 无痕,v2 检查框 | 7.1 或更高 | 5.5 或更高,6 |
3.x | v3,v2 无痕,v2 检查框 | 7.1 或更高 | 5.5 或更高,6 (*) |
2.x | v2 无痕,v2 检查框 | 5.5.9,7.0 或更高 | 5.0 或更高 |
(*) 版本 3.6.1 适用于 Laravel 6
Composer
您可以通过 composer 安装此包
$ composer require biscolab/laravel-recaptcha
Laravel 5.5(或更高版本)使用包自动发现,因此不需要您手动添加 Service Provider,但如果您不使用自动发现,则必须在 config/app.php
中注册 ReCaptchaServiceProvider
'providers' => [ ... Biscolab\ReCaptcha\ReCaptchaServiceProvider::class, ];
您可以使用 facade 以缩短代码。将 ReCaptcha
添加到您的别名
'aliases' => [ ... 'ReCaptcha' => Biscolab\ReCaptcha\Facades\ReCaptcha::class, ];
发布包
使用以下 artisan 命令创建 config/recaptcha.php
配置文件
$ php artisan vendor:publish --provider="Biscolab\ReCaptcha\ReCaptchaServiceProvider"
设置环境变量
添加您的 API 密钥
打开 .env
文件并设置 RECAPTCHA_SITE_KEY
和 RECAPTCHA_SECRET_KEY
# in your .env file RECAPTCHA_SITE_KEY=<YOUR_API_SITE_KEY> RECAPTCHA_SECRET_KEY=<YOUR_API_SECRET_KEY> RECAPTCHA_SKIP_IP=<YOUR_IP_LIST>
RECAPTCHA_SKIP_IP
(自 v5.2.0 起不再需要,CSV 格式)允许您添加 IP/CIDR(包括子网掩码)列表。它将是 skip_ip
的值
以下环境变量已被删除!!! 现在,只有敏感信息(如 API 密钥)才允许作为环境变量,这意味着您必须在
config/recaptcha.php
中设置配置值
RECAPTCHA_DEFAULT_VERSIONRECAPTCHA_CURL_TIMEOUTRECAPTCHA_DEFAULT_VALIDATION_ROUTERECAPTCHA_DEFAULT_TOKEN_PARAMETER_NAMERECAPTCHA_DEFAULT_LANGUAGE
完整配置
打开 config/recaptcha.php
配置文件并设置 version
return [ 'api_site_key' => env('RECAPTCHA_SITE_KEY', ''), 'api_secret_key' => env('RECAPTCHA_SECRET_KEY', ''), // changed in v4.0.0 'version' => 'v2', // supported: "v3"|"v2"|"invisible" // @since v3.4.3 changed in v4.0.0 'curl_timeout' => 10, 'skip_ip' => env('RECAPTCHA_SKIP_IP', []), // array of IP addresses - String: dotted quad format e.g.: "127.0.0.1", IP/CIDR netmask eg. 127.0.0.0/24, also 127.0.0.1 is accepted and /32 assumed // @since v3.2.0 changed in v4.0.0 'default_validation_route' => 'biscolab-recaptcha/validate', // @since v3.2.0 changed in v4.0.0 'default_token_parameter_name' => 'token', // @since v3.6.0 changed in v4.0.0 'default_language' => null, // @since v4.0.0 'default_form_id' => 'biscolab-recaptcha-invisible-form', // Only for "invisible" reCAPTCHA // @since v4.0.0 'explicit' => false, // true|false // @since v4.3.0 'api_domain' => "www.google.com", // default value is "www.google.com" // @since v5.1.0 'empty_message' => false, // @since v5.1.0 'error_message_key' => 'validation.recaptcha', // @since v4.0.0 'tag_attributes' => [ 'theme' => 'light', // "light"|"dark" 'size' => 'normal', // "normal"|"compact" 'tabindex' => 0, 'callback' => null, // DO NOT SET "biscolabOnloadCallback" 'expired-callback' => null, // DO NOT SET "biscolabOnloadCallback" 'error-callback' => null, // DO NOT SET "biscolabOnloadCallback" ] ];
键 | 类型 | 描述 | 默认值 |
---|---|---|---|
api_site_key 和 api_secret_key |
字符串 |
创建 Google API 身份验证所需的 reCAPTCHA 密钥。有关站点密钥和密钥的更多信息,请访问 Google reCAPTCHA 开发者文档 | '' |
版本 |
字符串 |
指示 reCAPTCHA 版本(支持:v3|v2|不可见)。有关 reCAPTCHA 版本的更多信息,请访问 https://developers.google.com/recaptcha/docs/versions | 'v2' |
curl_timeout |
int |
允许 cURL 函数执行的最大秒数 | 10 |
skip_ip |
array | string |
IP 地址的白名单(数组或 CSV),如果识别到,将禁用 reCAPTCHA 验证(始终返回 true),并且如果您在 blade(视图)文件中嵌入 JS 代码,则不会执行验证调用 | [] |
default_validation_route |
字符串 |
通过 JavaScript 内置验证脚本调用的路由(仅限 v3) | 'biscolab-recaptcha/validate' |
default_token_parameter_name |
字符串 |
发送到 default_validation_route 以进行验证的 "token" GET 参数的名称(仅限 v3) |
'token' |
default_language |
字符串 |
默认语言代码。对 v3 无效。有关更多信息,请参阅 https://developers.google.com/recaptcha/docs/language | null |
default_form_id |
字符串 |
默认表单 ID。仅适用于 "不可见" reCAPTCHA | 'biscolab-recaptcha-invisible-form' |
explicit |
bool |
可以通过指定您的 onload 回调函数并向 JavaScript 资源添加参数来实现延迟渲染。对 v3 和不可见(支持值:true|false)无效 | false |
api_domain |
字符串 |
自定义 API 域。默认值为 'www.google.com' ,但如果不可用,可以将该值设置为 'www.recaptcha.net' 。有关更多信息,请参阅 我可以在全球范围内使用 reCAPTCHA 吗? |
'www.google.com' |
empty_message |
bool |
将默认错误消息设置为 null |
false |
error_message_key |
字符串 |
设置默认错误消息的翻译键 | 'validation.recaptcha' |
(array) tag_attributes
键 | 类型 | 描述 | 默认值 |
---|---|---|---|
tag_attributes.theme |
字符串 |
小部件的颜色主题。(支持值:"light"|"dark") | 'light' |
tag_attributes.size |
字符串 |
小部件的大小。(支持值:"normal"|"compact") | 'normal' |
tag_attributes.tabindex |
int |
小部件和挑战的 tabindex | 0 |
tag_attributes.callback |
字符串 |
您的回调函数的名称,在用户提交成功响应时执行。将 g-recaptcha-response 令牌传递给您的回调 | null |
tag_attributes.expired-callback |
字符串 |
您的回调函数的名称,在 reCAPTCHA 响应过期且用户需要重新验证时执行 | null |
tag_attributes.error-callback |
字符串 |
您的回调函数的名称,当 reCAPTCHA 遇到错误(通常是网络连接)且无法继续直到连接恢复时执行。如果您在此处指定一个函数,您负责通知用户他们应该重试 | null |
不要将
tag_attributes.callback
、tag_attributes.expired-callback
和tag_attributes.error-callback
设置为biscolabOnloadCallback
。biscolabOnloadCallback
是当 显式 设置为true
并且小部件onload
事件触发时调用的默认 JavaScript 回调函数。
您可以在以下位置找到有关 tag_attributes.*
的更多详细信息 https://developers.google.com/recaptcha/docs/display#render_param
重新加载配置缓存文件
!!! 重要 !!! 每次更改某些配置时,请运行以下 shell 命令
$ php artisan config:cache
您已更新了吗?
如果您正在从旧版本迁移,请检查您的 config/recaptcha.php
配置文件,并将其与 https://github.com/biscolab/laravel-recaptcha/blob/master/config/recaptcha.php 进行比较。
确保
config/recaptcha.php
已更新
自定义错误信息
仅适用于 v2 和隐形用户。
在开始之前,请将验证信息添加到 resources/lang/[LANG]/validation.php
文件中
return [ ... 'recaptcha' => 'Hey!!! :attribute is wrong!', ];
嵌入 Blade
在关闭 </head>
标签之前插入 htmlScriptTagJsApi()
辅助函数。
您还可以使用 ReCaptcha::htmlScriptTagJsApi()
。
<!DOCTYPE html> <html> <head> ... {!! htmlScriptTagJsApi($configuration) !!} </head>
htmlScriptTagJsApi
htmlScriptTagJsApi
函数接受 $configuration
参数。根据您使用的 ReCAPTCHA 类型,$configuration
包含不同的键。
ReCAPTCHA v2 复选框
htmlScriptTagJsApi($configuration)
$configuration
参数可以包含以下键
lang
设置 reCAPTCHA 语言。这将覆盖config/recaptcha.php
中的default_language
。在此处您可以找到可用的完整语言列表 https://developers.google.com/recaptcha/docs/language
表单设置
在您插入 htmlFormSnippet()
辅助函数到您想要使用字段 g-recaptcha-response
的表单中之后。
您还可以使用 ReCaptcha::htmlFormSnippet()
.
<form> @csrf ... {!! htmlFormSnippet() !!} <!-- OR --> {!! htmlFormSnippet($attributes) !!} <input type="submit"> </form>
不要忘记
@csrf
blade 指令
htmlFormSnippet([, array $attributes = [] ])
htmlFormSnippet
函数不需要属性,但您可以覆盖默认的 data-
属性
{!! htmlFormSnippet([ "theme" => "light", "size" => "normal", "tabindex" => "3", "callback" => "callbackFunction", "expired-callback" => "expiredCallbackFunction", "error-callback" => "errorCallbackFunction", ]) !!}
htmlFormSnippet
方法允许以下属性名称
- theme
- size
- tabindex
- callback
- expired-callback
- error-callback
任何不同的属性名称都将被拒绝
自定义
在 config/recaptcha.php
中,您可以自定义 reCAPTCHA 小部件设置 tag_attributes
数组值。请参阅 完整配置 中的 tag_attributes
部分
ReCAPTCHA v2 隐形
htmlScriptTagJsApi($configuration)
$configuration
参数可以包含以下键
form_id
设置 reCAPTCHA 表单 ID。这将覆盖config/recaptcha.php
中的default_form_id
。此值将由getFormId()
函数返回,以便设置表单标签的id
属性。
表单设置
在您插入 htmlFormButton($button_label, $properties)
辅助函数到您想要使用 reCAPTCHA 的表单中之后。
此函数创建提交按钮,因此您不需要插入 <input type="submit">
或类似的。
您还可以使用 ReCaptcha::htmlFormButton($button_label, $properties)
.
$button_label
是您想要在提交按钮上写入的内容
<form id="{{ getFormId() }}"> @csrf ... {!! htmlFormButton($button_label, $properties) !!} </form>
不要忘记
@csrf
blade 指令
getFormId()
getFormId
函数返回默认表单 ID 值。这是 config/recaptcha.php
中的 default_form_id
的值或之前作为 htmlScriptTagJsApi
辅助函数参数设置的 $configuration['form_id']
。
$configuration['form_id']
覆盖默认设置。
htmlFormButton()
htmlFormButton
函数接受 2 个参数
$button_label
: (字符串:可选) 按钮标签。例如:订阅!
;$properties
: (数组:可选) HTML 按钮属性。例如
// $properties = [ 'class' => 'btn btn-info', 'data-foo' => 'bar' ]
如果设置了
data-sitekey
和data-callback
属性,它们将被覆盖
如果设置了
class
属性,则将附加值g-recaptcha
验证提交数据
将 recaptcha
添加到您的规则中
$validator = Validator::make(request()->all(), [ ... 'g-recaptcha-response' => 'recaptcha', // OR since v4.0.0 recaptchaFieldName() => recaptchaRuleName() ]); // check if validator fails if($validator->fails()) { ... $errors = $validator->errors(); }
嵌入 Blade
在关闭 </head>
标签之前插入 htmlScriptTagJsApi($config)
辅助函数。
<!DOCTYPE html> <html> <head> ... {!! htmlScriptTagJsApi([ 'action' => 'homepage', 'callback_then' => 'callbackThen', 'callback_catch' => 'callbackCatch' ]) !!} <!-- OR! --> {!! htmlScriptTagJsApi([ 'action' => 'homepage', 'custom_validation' => 'myCustomValidation' ]) !!} </head>
$config
是必需的,是一个关联数组,包含用于 JavaScript 验证处理的所需配置参数。
键是
键 | 必需 | 描述 | 默认值 |
---|---|---|---|
action |
无 | 是reCAPTCHA v3 API(更多信息)所需的action 参数 |
主页 |
custom_validation |
无 | 是您自定义回调JavaScript函数的名称,该函数将覆盖此包内置的JavaScript验证系统 | 空字符串 |
callback_then |
无 | (如果设置了custom_validation 则忽略)是当内置的JavaScript验证系统在响应成功时调用的您自定义的回调JavaScript函数的名称 |
空字符串 |
callback_catch |
无 | (如果设置了custom_validation 则忽略)是当内置的JavaScript验证系统在响应错误时调用的您自定义的回调JavaScript函数的名称 |
空字符串 |
内置JavaScript验证系统
grecaptcha.execute
的回调中,将使用fetch
函数执行到config('recaptcha.default_validation_route')
的ajax调用。如果响应成功,将接收到一个Promise对象,并将其作为参数传递给您设置的callback_then
函数。如果没有设置,则不会执行任何操作。
与callback_catch
相同。在响应错误事件中调用callback_catch
,错误将作为参数传递给该函数。如果没有设置,则不会执行任何操作。
请访问使用Fetch以获取有关fetch
JavaScript函数的更多信息。
警告!!! 检查浏览器兼容性
fetch
函数与一些浏览器(如IE)存在兼容性问题。请创建一个自定义验证函数,并将custom_validation
设置为该函数的名称。该函数必须接受从Google reCAPTCHA API收到的token
作为参数。
验证Laravel路由
默认验证路由是config('recaptcha.default_validation_route', 'biscolab-recaptcha/validate')
。
路由和相对控制器都是内置在包中的。该路由通过Laravel web
中间件进行过滤和保护,这就是为什么重要,您需要嵌入csrf-token
HTML元标签,并发送X-Requested-With
和X-CSRF-TOKEN
头。
您还可以通过在recaptcha.php
配置文件中更改default_validation_route
值来更改验证端点。
<head> ... <!-- IMPORTANT!!! remember CSRF token --> <meta name="csrf-token" content="{{ csrf_token() }}"> </head>
验证响应对象
输出将是一个包含以下数据的JSON
- 默认输出(无错误)
{ "action":"homepage", "challenge_ts":"2019-01-29T00:42:08Z", "hostname":"www.yourdomain.ext", "score":0.9, "success":true }
- 当调用IP包含在"skip_ip"配置白名单中时的输出
{ "skip_by_ip":true, "score":0.9, "success":true }
如果您使用
htmlScriptTagJsApiV3
助手在blade文件中嵌入代码,则不会执行验证调用!更多信息请参阅配置页面
- 来自Google reCAPTCHA API的空响应输出
{ "error":"cURL response empty", "score":0.1, "success":false }
在下一段中,您可以学习如何处理验证promise对象
"callback_then"和"callback_catch"
在内置验证之后,您应该做一些事情。如何?使用callback_then
和callback_catch
函数。
您需要做的是只是创建函数,并设置它们的参数。
-
callback_then
必须接收一个类型为Promise
的参数。 -
callback_catch
必须接收一个类型为string
的参数
结果应该是这样的
<head> ... <!-- IMPORTANT!!! remember CSRF token --> <meta name="csrf-token" content="{{ csrf_token() }}"> ... <script type="text/javascript"> function callbackThen(response){ // read HTTP status console.log(response.status); // read Promise object response.json().then(function(data){ console.log(data); }); } function callbackCatch(error){ console.error('Error:', error) } </script> ... {!! htmlScriptTagJsApiV3([ 'action' => 'homepage', 'callback_then' => 'callbackThen', 'callback_catch' => 'callbackCatch' ]) !!} </head>
“custom_validation”函数
如前所述,您可以使用自己的函数处理验证。为此,您必须编写自己的函数,并将custom_validation
参数设置为该函数的名称。
结果应该是这样的
<head> ... <!-- IMPORTANT!!! remember CSRF token --> <meta name="csrf-token" content="{{ csrf_token() }}"> ... <script type="text/javascript"> function myCustomValidation(token) { // do something with token } </script> ... {!! htmlScriptTagJsApiV3([ 'action' => 'homepage', 'custom_validation' => 'myCustomValidation' ]) !!} </head>