Google Firebase Cloud Functions:Android应用程序调用`siteverify`的后端调用实际上需要使用计费帐户[重复]

Posted

技术标签:

【中文标题】Google Firebase Cloud Functions:Android应用程序调用`siteverify`的后端调用实际上需要使用计费帐户[重复]【英文标题】:Google Firebase Cloud Functions: Android app's call to backend which calls `siteverify` actually requires a billing account to be used [duplicate] 【发布时间】:2020-03-17 16:22:38 【问题描述】:

我使用 Google Firebase Cloud Functions 来托管以下脚本,以检查 ReCaptcha 键入的我的 android 应用程序的用户是否正确。这个想法是,在用户输入验证码后,应用程序会调用 Cloud Functions 的脚本(托管在 Google 服务器中)。然后后者通过 POST 请求调用以下 URL:https://www.google.com/recaptcha/api/siteverify。

问题:在 Google 服务器的日志中,我发现了以下错误:

未配置结算帐号。外部网络无法访问,配额受到严格限制。配置结算帐号以移除这些限制

Error: Error: getaddrinfo EAI_AGAIN www.google.com:443
    at Request._callback (/srv/index.js:20:10)
    at self.callback (/srv/node_modules/request/request.js:185:22)
    at emitOne (events.js:116:13)
    at Request.emit (events.js:211:7)
    at Request.onRequestError (/srv/node_modules/request/request.js:881:8)
    at emitOne (events.js:116:13)
    at ClientRequest.emit (events.js:211:7)
    at TLSSocket.socketErrorListener (_http_client.js:401:9)
    at emitOne (events.js:116:13)
    at TLSSocket.emit (events.js:211:7)

托管在 Google Cloud Functions 的服务器中的后端脚本如下:

const functions = require('firebase-functions');
const request2 = require('request');

/**
 * Verifies a Recaptcha filled by the user in his Android app.
 * 1. Success: returns the JSON response
 * 2. Failure: throws the error
 **/
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 = '';
    request2.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;
    );

);

我的问题是:有什么方法可以在不创建结算帐户的情况下请求此 URL?

【问题讨论】:

您调用的网址属于 Google 服务,因此它应该适用于免费计划。很可能该 URL 模式只是从允许的 URL 列表中丢失。请file a bug report. @FrankvanPuffelen 完成!谢谢你。 :) @FrankvanPuffelen 来自 Firebase 开发人员:这个问题已经为人所知,他们正在努力解决。但他们不能告诉我什么时候能解决。 【参考方案1】:

编辑:正如 Frank 在 cmets 中指出的那样,我错过了这是一个内部 URL,并且始终显示免费计划的消息,即使请求应该有效。如果请求不起作用,则应提交错误。

我的答案是针对非 Google(例如外部)网址,我将在下面保留该网址(因为它允许您在解决错误时绕过检查)。


没有。您需要一个计费帐户才能从 Cloud Functions 发出外部网络请求。请参阅Cloud Functions Section of the pricing page。

不过,只需配置一个计费帐户,您仍然可以利用 Spark 计划的免费层级限制。仅发出外部网络请求不会产生实际成本。

【讨论】:

我有 Spark 计划。这样报错正常吗? > 仅限 Google 服务 + 调用:125K/月" 是的,这是您在使用 spark 计划提出请求时遇到的错误。配置计费帐户基本上会让您使用 Blaze 计划(但您仍然可以获得 spark 计划的免费层限制)。据我了解,您可以从云功能free 获得 5GB 的出站网络 - 与火焰计划相同。 @robsiemb 对于免费计划中的项目始终会显示警告,即使它们仅调用 Google 拥有的服务也是如此。 Blast,你说得对,我错过了那个 URL,谢谢。我会编辑答案。

以上是关于Google Firebase Cloud Functions:Android应用程序调用`siteverify`的后端调用实际上需要使用计费帐户[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Storage 上传是不是会触发 Firebase Cloud 功能?

链接现有的Firebase和Google Cloud项目

使用 Cloud Functions for Firebase 和 @google-cloud/storage 删除图像时出现问题

两个 Firebase 只链接到一个 Google Cloud Platform?

Google Cloud Messaging与Firebase

在 firebase 函数中创建 Google Cloud Task