gpt4 book ai didi

node.js - 谷歌的 recaptcha api 的无效输入 secret

转载 作者:太空宇宙 更新时间:2023-11-03 21:59:09 24 4
gpt4 key购买 nike

我正在尝试在我的网站上使用 recaptcha。带有 Express 框架的 Nodejs 服务器。该网站尚未托管,我仍在本地进行处理。在主页上,用户输入信息创建帐户并解决验证码后,我发送结果

$("#g-recaptcha-response").val()

到服务器。在我的服务器上,

https.get("https://www.google.com/recaptcha/api/siteverify?secret=" + SECRET + "&response=" + key, function(res) {
var data = "";
res.on('data', function (chunk) {
data += chunk.toString();
});
res.on('end', function() {
try {
var parsedData = JSON.parse(data);
console.log(parsedData);
callback(parsedData.success);
} catch (e) {
callback(false);
}
});
});

其中 key 是响应,SECRET 是他们给你的 key 。我宣布变量 SECRET 并将 key 作为字符串存储在其中。

每一次,对于

console.log(parsedData); 

它说的是

{ success: false, 'error-codes': [ 'invalid-input-secret' ] }

我把秘钥复制粘贴了,怎么会失效呢。仅当“ secret 参数无效或格式错误”时才应该显示此错误,正如其 website 上所述。 。我关注了这个tutorial .

最佳答案

我也按照教程进行操作,然后遇到了您在此处报告的相同错误。仔细观察tutorial中的截图它显示

使用这些参数发送 GET 请求 enter image description here

并检查 Google reCaptcha website它说

使用这些参数发送 POST 请求 enter image description here

我很好奇 Google 是否改变了对 POST 而不是 GET 的想法,或者教程中的屏幕截图来自不同的来源。

无论如何,我已经调整了教程中的代码版本以发出 POST 请求(下面的代码使用 querystring 模块),请参见下文:

var SECRET = "YourSecretHere";

// Helper function to make API call to recatpcha and check response
function verifyRecaptcha(key, callback) {
//declare above var querystring = require('querystring') on top
var post_data = querystring.stringify({
'secret' : SECRET,
'response': key
});

var post_options = {
host: 'www.google.com',
port: '443',
method: 'POST',
path: '/recaptcha/api/siteverify',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(post_data)
}
};
var req = https.request(post_options, function(res) {
var data = "";
res.on('data', function (chunk) {
data += chunk.toString();
});
res.on('end', function() {
try {
var parsedData = JSON.parse(data);
callback(parsedData.success);
} catch (e) {
callback(false);
}
});
});
req.write(post_data);
req.end();
req.on('error',function(err) {
console.error(err);
});
}

我还想添加 remoteip 字段是可选的,但是如果您愿意,您也可以传递该值。为此,您需要从连接对象中检索remoteIpAddress,或者只需在您的应用程序上启用信任代理,如下所示:

app.enable('trust proxy'); 

然后将 IP 地址传递给 verifyRecaptcha,调用如下所示:

verifyRecaptcha(req.ip, req.body["g-recaptcha-response"], function(success) {
if(success) { ...} else { ... }
});

然后,您需要修改 post_params 以包含 remoteip 字段,如下所示:

var post_data = querystring.stringify({
'secret' : SECRET,
'response': key,
'remoteip': ip
});

app.enable('trust proxy'); 允许 req.ipreq.ips(IP 地址数组)。有关获取请求的 IP 地址的更多信息,请参阅此 SO question .

如果您正在开发并且厌倦了所有棘手的著名和最烦人的 Street Names reCaptcha ,那么我建议您使用Google提供的测试SiteSecret key来覆盖验证码解析,以加快开发速度。请参阅here

关于node.js - 谷歌的 recaptcha api 的无效输入 secret ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32166007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com