Проверка reCAPTCHA v3 в функции Firebase вызывает проблему CORS - PullRequest
0 голосов
/ 07 мая 2020

У меня есть следующие коды, которые проверяют Google reCAPTCHA v3 в моей функции Firebase, которая вызвала проблему CORS :

const functions = require('firebase-functions');
const nodemailer = require("nodemailer");
const express = require("express");
const cors = require("cors");
const request = require('request');
const serverApi = express();

api.use(cors({ origin: true }));

function verifyCaptcha(token, returnData) {
    // Put your secret key here.
    var secretKey = functions.config().recaptcha.secretkey;

    var verificationUrl = "https://www.google.com/recaptcha/api/siteverify?secret=" + secretKey + "&response=" + token;

    // Note here: External network call to google.com
    request(verificationUrl, function (error, response, body) {
        body = JSON.parse(body);
        // Success will be true or false depending upon captcha validation.
        if (!body.success) {
            body['status'] = false;
            body['errSource'] = "recaptcha";
            body['message'] = "Failed to pass captcha verification.";

        } else {
            body['status'] = true;
            body['message'] = "Successfully passed captcha verification!";

        };
        console.log(`Google returns: ${JSON.stringify(body)}`);

        returnData(body);
    });
};

api.post("/api/service-name", (req, res) => {
    if (!req.body['g-recaptcha-response']) {
        return res.send({ "status": false, "errSource": "recaptcha", "message": "Client-side reCAPTCHA token not found." });
    };

    const recaptchaToken = req.body['g-recaptcha-response'];

    verifyCaptcha(recaptchaToken, function (result) {
        if (result.status == false) {
            return res.send(result);
        };

        // My business logics here.

    }); 
});

exports.api = functions.https.onRequest(api);

Я заметил, что после удаления Запрос проверки reCAPTCHA v3 в моей функции Firebase, больше никаких проблем CORS для моего локального хоста, чтобы вызвать "/api/service-name" с использованием $.ajax(). Это связано с тем, что следующий журнал функции Firebase напомнил мне о «Внешняя сеть недоступна» :

Billing account not configured. External network is not accessible and quotas are severely limited.
Configure billing account to remove these restrictions

Мой вопрос: Есть ли способ заставить мою серверную проверку reCAPTCHA работать, не вызывая этой проблемы CORS, которую можно предотвратить с помощью «Не настроена учетная запись для выставления счетов»? Спасибо!

ОБНОВЛЕНИЕ:

После обнаружения ошибки request(), которая выполняет проверку, я получаю следующую ошибку:

{errno: "EAI_AGAIN", code: "EAI_AGAIN", syscall: "getaddrinfo", hostname: "www.google.com", host: "www.google.com", …}

Также , после обработки этой ошибки проблема с CORS исчезла, но reCAPTCHA по-прежнему не может быть проверена. Есть идеи, что вызывает это? Еще раз спасибо!

1 Ответ

0 голосов
/ 07 мая 2020

Теперь подтверждено, что вышеуказанная проблема была решена после включения биллинга на Google Cloud Console . Это НЕ проблема CORS между локальным хостом и функциями / хостингом Firebase (хотя браузер Chrome вернулся как сообщение об ошибке, связанное с CORS), это на самом деле HTTP-запрос от функции Firebase к Google reCAPTCHA api в процессе проверки токена. Из-за того, что платежный аккаунт не связан с проектом Firebase, в котором находится эта функция, любые запросы от любых функций Firebase к любым внешним сетевым ресурсам, включая Google reCAPTCHA , будут отклонены со следующими ошибками:

Ошибка HTTP-запроса:

{errno: "EAI_AGAIN", code: "EAI_AGAIN", syscall: "getaddrinfo", hostname: "www.google.com", host: "www.google.com", …}

После включения биллинга в GCP и привязки платежного аккаунта к указанному c проекту Firebase запрос к проверке reCAPTCHA в Google будет успешным ( если токен действителен) без указанной выше ошибки. Однако ваша учетная запись FREE Spark Tier Firebase будет иметь АВТОМАТИЧЕСКОЕ ОБНОВЛЕНИЕ до Blaze Plan - Платите как вы go.

enter image description here

...