首页 > 解决方案 > Android reCAPTCHA:验证用户响应:所有函数都必须调用客户端!但是我可以使用我的后端吗?

问题描述

我想验证我的 Android 用户的 reCAPTCHA。所以我正在阅读这份文档:https ://developers.google.com/recaptcha/docs/verify :

对于 Android 库用户,您可以调用 SafetyNetApi.RecaptchaTokenResult。getTokenResult () 方法在状态返回成功时获取响应令牌。

在这个函数的手册中,关于getTokenResulthttps://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;    
    });

});

标签: androidgoogle-cloud-functionsrecaptcha

解决方案


您可以获取从 返回的令牌getTokenResult(),将其发送到您的后端,并让您的后端调用 Web API 版本siteverify

https://www.google.com/recaptcha/api/siteverify

推荐阅读