U-w*_*ays 12 post recaptcha node.js express
我在我的Web应用程序中设置了一个不可见的reCAPTCHA,无法验证用户的响应.(即使我传递了正确的POST参数)
我通过调用grecaptcha.execute();客户端以编程方式调用挑战.然后registrationForm.submit();使用recaptcha回调提交表单()()
<div class="g-recaptcha"
data-sitekey="SITE_KEY"
data-callback="onSubmit"
data-size="invisible">
</div>
Run Code Online (Sandbox Code Playgroud)
现在阅读"验证用户响应"文档后,我发现响应令牌作为POST参数传递给g-recaptcha-response:
对于Web用户,您可以通过以下三种方式之一获取用户的响应令牌:
- 用户在您的站点上提交表单时的g-recaptcha-response POST参数
- ...
所以我使用Fetch在服务器端使用所需的正文数据在验证端点上创建POST请求:
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();
});
}
Run Code Online (Sandbox Code Playgroud)
但我一直得到以下回应:
{success:false,error-codes:['missing-input-response','missing-input-secret']}
即使我将响应和秘密作为JSON数据传递给POST正文.
难道我做错了什么?问候.
U-w*_*ays 29
在reCaptcha Google论坛上进行一些研究和挖掘,似乎这个端点只接受默认的内容类型; application/x-www-form-urlencoded.
这意味着你应该不使用JSON发送您的响应令牌与本站关键.而是按照application/x-www-form-urlencoded定义的方式发送值:
使用此内容类型提交的表单必须按如下方式编码:
- 控制名称和值将被转义.空格字符被替换为'+',然后保留字符被转义,如[RFC1738],第2.2节中所述:非字母数字字符被'%HH'替换,百分号和两个十六进制数字代表ASCII代码字符.换行符表示为"CR LF"对(即'%0D%0A').
- 控件名称/值按它们在文档中出现的顺序列出.名称通过'='与值分隔,名称/值对通过'&'彼此分隔.
因此,您有两种方法可以执行此操作,方法是将POST参数传递给URL(查询字符串)并将其作为POST请求发送:
https://www.google.com/recaptcha/api/siteverify?secret=${SECRET_KEY}&response=${req.body['g-recaptcha-response']}
Run Code Online (Sandbox Code Playgroud)
或者手动将数据附加到正文,如下所示:
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();
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5780 次 |
| 最近记录: |