微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ReCaptcha Enterprise api 调用始终返回 0 分,但仪表板显示每个分数都为 0.8 或更高

如何解决ReCaptcha Enterprise api 调用始终返回 0 分,但仪表板显示每个分数都为 0.8 或更高

我为前端创建了一个 ReCaptcha Enterprise 项目,并尝试在 AWS Lambda 中验证评估。

ReCaptcha 项目如下所示:ReCaptcha Settings

前端代码一个反应应用程序,但我只是按照文档使用脚本。这一切似乎都有效。我可以解决验证码并得到答案。

const [captchaAnswer,setCaptchaAnswer] = useState<string | null>(null);

useEffect(() => {
    const script = document.createElement('script');

    script.src = "https://www.google.com/recaptcha/enterprise.js";
    script.async = true;
    script.defer = true;

    document.body.appendChild(script);
        
     return () => {
        document.body.removeChild(script);
    }
},[]);


window.reCaptchaCallback = function (response: string) {
    setCaptchaAnswer(response);
};

const submit = () => {
    //Submits the answer to my lambda
}

return (
    <div className="g-recaptcha" data-sitekey="<SITEKEY>" data-callback="reCaptchaCallback" />
);

接下来是作为 Cognito 触发器调用的 lambda。

const axios = require("axios");

const config = {
  PROJECT_ID: "<PROJECTID>",API_KEY: "<APIKEY>",//actually gotten from secret manager
  SITE_KEY:"<SITEKEY>"
};

exports.handler = async (event) => {
  console.log(event);
  
  if (event.triggerSource === "PreSignUp_Admincreateuser") {
    return event;
  }

  if (!event.request.validationData) {
    throw new Error('Missing validation data');
  }
  
  try {
    const verifyResponse = await axios({
      method: 'post',url: `https://recaptchaenterprise.googleapis.com/v1beta1/projects/${config.PROJECT_ID}/assessments?key=${config.API_KEY}`,body: {
        event: {
          token: event.request.validationData.token,//I have confirmed this is correctly passed from front end to here
          siteKey: config.SITE_KEY
          expectedAction: "" //Tried it with and without this. Documentation say it isn't being used
        }
      },headers: { "Content-Type": "application/x-www-form-urlencoded" }
    });

    console.log(JSON.stringify(verifyResponse.data));
    
    if (verifyResponse.data.score >= 0) {
      event.response.autoConfirmUser = true;
      return event;
    } else {
      throw new Error('Recaptcha verification Failed');
    }
  } catch (error) {
    console.error(error);
    throw new Error("Recaptcha verification Failed. Please retry");

  }
};

这是我一直得到的回应。

{
    "name": "projects/<PROJECT>/assessments/924d7fc3f0000000","score": 0,"reasons": []
}

然而,recaptcha dashboard 显示所有评估都 >= 0.8 我不知道我做错了什么。感谢您的帮助。

解决方法

根据我的经验,响应中缺少 tokenProperties 意味着 googleapis.com 未能读取您的 POST 数据。

对于您的情况,首先预期的内容类型应该是 json:

    "Content-Type": "application/json; charset=utf-8"

如果更改以上内容不能解决问题,请尝试将 post 数据从 object/dict/json 也更改为 string

tips:一般来说,当我们在代码中无法得到预期的响应时,我们可以尝试在像 curl 或 jmeter 这样的直接工具中试验目标请求以找出问题所在,然后将解决方案复制回我们的代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。