我正在尝试在我的网站上使用recaptcha。 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是他们给你的密钥。我宣布了 变量SECRET并将密钥存储为其中的字符串。
每次都是
console.log(parsedData);
这是说
{ success: false, 'error-codes': [ 'invalid-input-secret' ] }
我复制并粘贴了密钥,怎么可能无效。如果“秘密参数无效或格式错误”,它只应显示此错误,如同website所述。我遵循了tutorial。
答案 0 :(得分:2)
我也遵循了教程,然后碰到了你在这里报告的相同错误。仔细查看tutorial显示的屏幕截图
并检查Google reCaptcha website它说
我很好奇Google是否改变了对POST而不是GET的看法,或者教程中的屏幕截图来自不同的来源。
无论如何,我已经调整了教程中的代码版本以发出POST请求(下面代码使用查询字符串模块),见下文:
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.ip
和req.ips
这是一个ip地址数组。有关获取请求的IP地址的详细信息,请参阅此SO question。
如果您正在开发并且厌倦了所有棘手的着名且最烦人的Street Names reCaptcha,那么我建议您使用Google提供的测试Site
和Secret keys
来覆盖验证码解决方案以加快开发速度。见here
答案 1 :(得分:0)
这真是太愚蠢了,我不敢相信我浪费了这么多时间,但是我没有使用变量SECRET,而是将我的密钥添加到网址中并且它有效。