仅在 js 客户端检查是不够的。
您还需要检查后端服务器端。客户端从谷歌验证码服务获取字符串响应。客户端将该字符串发送到您的服务器。您的服务器将带有私钥的字符串发送到谷歌验证码服务,并根据答案做出决定。
更新:
这是与 asp.net web api 一起使用的代码部分
角度控制器
angular
.module('yourApp', ['vcRecaptcha'])
.controller('YourController', YourController);
function YourController($scope, vcRecaptchaService) {
var recaptcha = {
key: "your recaptcha public key",
widgetId: null,
response: null,
setWidget: function(widgetId) { recaptcha.widgetId = widgetId; },
setResponse: function(response) { recaptcha.response = response; },
cbExpiration: function() { recaptcha.response = null; },
reset: function () {
recaptcha.response = null;
vcRecaptchaService.reload(recaptcha.widgetId);
}
};
$scope.recaptcha = recaptcha;
$scope.reset = function() {
$scope.info = undefined;
recaptcha.reset();
};
$scope.sendData = function(form, recaptchaResponse) {
if (form.$invalid) return;
$http.post('/api/endpoint', { data: ..., recaptchaResponse: recaptchaResponse})
.then(...
角度视图
<form name="yourForm" novalidate ng-submit="sendData(yourForm, recaptcha.response)>
...
<input type="hidden" name="recaptchaResponse" ng-model="recaptcha.response" required/>
<div class="recaptcha-container">
<div vc-recaptcha theme="'light'" key="recaptcha.key"
on-create="recaptcha.setWidgetId(widgetId)"
on-success="recaptcha.setResponse(response)"
on-expire="recaptcha.cbExpiration()"></div>
</div>
<span class="recaptcha-error-info" ng-show="yourForm.$submitted && (yourForm.recaptchaResponse.$invalid || yourForm.$error.recaptcha.length)">
Pass the check, please
</span>
...
asp.net web api 控制器
[RoutePrefix("api")]
public class YourApiController : ApiController
{
[HttpPost]
[Route("endpoint")]
public async Task<IHttpActionResult> Post([FromBody] YourVm model)
{
if (!ModelState.IsValid) return BadRequest(ModelState);
var remoteIp = Request.GetOwinContext().Request.RemoteIpAddress;
var recaptchaVerifyResponse = await VerifyAsync(model.RecaptchaResponse, remoteIp);
if (recaptchaVerifyResponse == null || !recaptchaVerifyResponse.Success) return BadRequest("recaptcha error");
...
}
// may be exrtracted into service
private async Task<RecaptchaVerifyResponse> VerifyAsync(string response, string remoteip)
{
const string RecaptchaVerifyUrl = "https://www.google.com/recaptcha/api/siteverify";
string responseString;
using (var client = new HttpClient())
{
var values = new Dictionary<string, string>
{
{"secret", "your recaptcha private key"},
{"response", response},
{"remoteip", remoteip},
};
var content = new FormUrlEncodedContent(values);
var postResponse = await client.PostAsync(RecaptchaVerifyUrl, content);
responseString = await postResponse.Content.ReadAsStringAsync();
}
if (string.IsNullOrWhiteSpace(responseString)) return null;
RecaptchaVerifyResponse result;
try
{
result = JsonConvert.DeserializeObject<RecaptchaVerifyResponse>(responseString);
}
catch (JsonException)
{
return null;
}
return result;
}
}
public class RecaptchaVerifyResponse
{
[JsonProperty("success")]
private bool? _success = null;
public bool Success
{
get { return _success == true; }
}
[JsonProperty("error-codes")]
private string[] _errorCodes = null;
public string[] ErrorCodes
{
get { return _errorCodes ?? new string[0]; }
}
}