我在我的web应用程序中设置了invisible reCAPTCHA,但无法验证用户的响应.(即使我正在传递正确的POST参数)

我通过在客户端调用grecaptcha.execute();以编程方式调用挑战.然后使用recaptcha回调提交表单(registrationForm.submit();):

<div class="g-recaptcha"
  data-sitekey="SITE_KEY"
  data-callback="onSubmit"
  data-size="invisible">
</div>

现在,在阅读了"Verifying the user's response"篇文档之后,我发现响应令牌作为POST参数传递给g-recaptcha-response:

对于web用户,可以通过以下三种方式之一获取用户的响应令牌:

  • 当用户在您的网站上提交表单时,g-recaptcha-response POST参数
  • ...

因此,我使用Fetch在服务器端创建一个POST请求,将所需的正文数据发送到verification endpoint:

verify(req, res, next) {
  const VERIFY_URL = "https://www.google.com/recaptcha/api/siteverify";

  return fetch(VERIFY_URL, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      secret:   process.env.RECAP_INVIS_SECRET_KEY,
      response: req.body['g-recaptcha-response'],
    }),
  })
  .then(response => response.json())
  .then(data => {
    res.locals.recaptcha = data;
    return next();
  });
}

但我一直得到以下回应:

{

尽管我将响应和机密作为JSON数据传递到帖子正文中.

我做错什么了吗?当做

推荐答案

Doing a bit of research and digging around the reCaptcha Google forums, It seems that this endpoint only accepts the default content type; application/x-www-form-urlencoded.

这意味着您应该使用JSON来发送响应令牌和站点密钥.而是按照application/x-www-form-urlencoded的定义发送值:

使用此内容类型提交的表格必须按以下方式编码:

  1. 控件名称和值被转义.空格字符替换为"+",然后按照[RFC1738]第2.2节所述对保留字符进行转义:非字母数字字符替换为"%HH",一个百分号和两个十六进制数字,代表字符的ASCII码.换行符表示为"CR-LF"对(即"%0D%0A").
  2. 控件名称/值按它们在文档中的显示顺序列出.名称与值之间用"="分隔,名称/值对之间用"&;"分隔.

因此,有两种方法可以做到这一点,一种是通过URL(查询字符串)传递POST参数,另一种是作为POST请求发送:

https://www.google.com/recaptcha/api/siteverify?secret=${SECRET_KEY}&response=${req.body['g-recaptcha-response']}

或者手动将数据添加到正文中,如下所示:

verify(req, res, next) {
  const VERIFY_URL = "https://www.google.com/recaptcha/api/siteverify";

  return fetch(VERIFY_URL, {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: `secret=${SECRET_KEY}&response=${req.body['g-recaptcha-response']}`,
  })
  .then(response => response.json())
  .then(data => {
    res.locals.recaptcha = data;
    return next();
  });
}

The official Google documentation can be found here:
Recaptcha - Verifying the user's response.

Node.js相关问答推荐

Mongoose-不会更新数组中的属性值

我的Node.js应用程序没有将Mongoose方法findByIdAndDelete作为函数进行检测

如何发送比特币BTC使用发送加密使用WIF密钥在 node ,js

在 azure blob 容器之间复制文件

如果我在父文件夹中运行,子进程生成不起作用

如何在 JavaScript 中显示多维数组中使用的一维数组的变量名?

nyc 代码覆盖不适用于 NodeJs Express 服务器

错误:0308010C:try 通过 Github 推送部署到 firebase 托管时出现数字

使用 node/express/Multer,您如何首先判断参数?

获取用户 ID 后,Firebase 函数 onCreate 方法在 Firestore 上不起作用

ESLint:TypeError:this.libOptions.parse 不是函数

nuxt:在 docker 镜像中找不到

AWS EC2 npm install 突然很慢

使用 Node.js 在内存中缓冲整个文件

与 NPM 一起安装时找不到 Express 模块

如何为 node.js 服务器分配域名?

使用 pg-promise 进行多行插入

使用 Node.js 我得到错误:EISDIR,读取

Node.js 中的 Streams3 是什么,它与 Streams2 有何不同?

如何断言不为空?