android - Android reCAPTCHA:验证用户响应:所有函数都必须调用客户端!但是我可以使用我的后端吗?
问题描述
我想验证我的 Android 用户的 reCAPTCHA。所以我正在阅读这份文档:https ://developers.google.com/recaptcha/docs/verify :
对于 Android 库用户,您可以调用 SafetyNetApi.RecaptchaTokenResult。getTokenResult () 方法在状态返回成功时获取响应令牌。
在这个函数的手册中,关于getTokenResult
(https://developers.google.com/android/reference/com/google/android/gms/safetynet/SafetyNetApi.RecaptchaTokenResult.html#getTokenResult())的描述如下:
获取 reCAPTCHA 用户响应令牌,该令牌必须通过调用验证用户响应中描述的siteverify方法进行验证。
该siteverify
函数的手册描述如下(https://developers.google.com/android/reference/com/google/android/gms/safetynet/SafetyNetClient.html#verifyWithRecaptcha(java.lang.String)):
使用 reCAPTCHA 提供用户证明。
如果 reCAPTCHA 确信这是真实设备上的真实用户,它将返回一个没有挑战的令牌。否则,它将在返回令牌之前提供视觉/音频挑战来证明用户的人性。
我的问题
我想使用我的后端服务器(云功能)来验证 reCAPTCHA。但是,根据 Android 文档,上述所有功能似乎都放在客户端。确实,siteverify
应该使用获得的令牌调用getTokenResult
,并且两者似乎都是 Android SecureNET ReCAPTCHA Android API 的一部分......
但是,我认为使用 Cloud Functions 会更安全!但是我可以使用我的后端吗?
编辑:在 Cloud Functions 中对 siteverify 的后端调用
exports.verifyRecaptcha = functions.https.onRequest((request, response) => {
const user_response_token = request.query.user_response_token;
if(user_response_token == '') {
throw new functions.https.HttpsError('invalid-argument', 'The function must be called with an adequat user response token.');
}
const remote_url = 'https://www.google.com/recaptcha/api/siteverify';
const secret = null;
request.post({url: remote_url, form:{secret: secret, response: user_response_token}}, function(error, response, body) {
if(error) {
throw new functions.https.HttpsError('unknown', error);
}
if(!response.statusCode != 200) {
throw new functions.https.HttpsError('unknown', 'Something went wrong. Status code: ' + response.statusCode + '.');
}
if(!body.success) {
throw new functions.https.HttpsError('unknown', 'Unable to verify this captcha.');
}
return response;
});
});
解决方案
您可以获取从 返回的令牌getTokenResult()
,将其发送到您的后端,并让您的后端调用 Web API 版本siteverify
:
https://www.google.com/recaptcha/api/siteverify
推荐阅读
- c++ - 使用给定值初始化二维字符数组
- python - SphinxDirective 访问 config._raw_config 数据
- amazon-web-services - 警告:无法访问身份文件 InstanceLaunch.pem:没有这样的文件或目录
- ruby-on-rails - 从 Rails 4.1.16 升级到 4.2.0 时的 Postgres 问题
- javascript - 使用 ContentEditable 复制和粘贴表格
- node.js - FormData append 正在删除 String qouts angular
- c# - Xamarin 表单 - 无法扫描 BLE 设备
- r - 如果指标变量等于 1,如何生成汇总统计?
- python - 如何使 ASCII 铃声不创建换行符?
- python - matplotlib 子图一次只显示一个子图