NodeJS后端验证reCAPTCHA遇阻:报错missing-input-response与missing-input-secret
解决NodeJS中reCAPTCHA验证的
missing-input-response/missing-input-secret错误 嘿,我来帮你搞定这个问题!你遇到的这两个错误,核心原因是请求参数的传递方式不符合Google reCAPTCHA接口的要求。
问题根源
Google的siteverify接口要求参数通过**表单编码(application/x-www-form-urlencoded)**的方式发送,而你直接把secret和response放在了request的options根对象里——request库不会自动把这些参数转换成正确的格式,导致服务器根本没收到必要的参数,所以才返回缺失错误。
修复后的request库代码
把参数放进form字段里,request就会自动帮你处理成正确的表单编码格式:
var request = require('request'); function verifyRecaptcha(recaptchaToken, callback) { // 替换成你的reCAPTCHA服务器端秘钥 const SECRET_KEY = 'MY_SECRET'; request.post( 'https://www.google.com/recaptcha/api/siteverify', { form: { // 关键:参数必须放在form对象中 secret: SECRET_KEY, response: recaptchaToken } }, function (error, response, body) { if (error) { console.error('验证请求失败:', error); return callback(false); } if (response.statusCode === 200) { // 注意:返回的body是JSON字符串,必须先解析成对象 const verificationResult = JSON.parse(body); console.log('reCAPTCHA验证结果:', verificationResult); // 回调返回验证是否成功 callback(verificationResult.success); } else { console.error('验证接口响应异常,状态码:', response.statusCode); callback(false); } } ); }
额外注意事项
- 确认
SECRET_KEY是服务器端秘钥(在Google reCAPTCHA控制台的“密钥设置”里获取),不要用客户端的Site Key recaptchaToken必须是前端用户完成验证后,传给后端的那个响应token,不能为空- request库已经被官方标记为废弃(deprecated),如果是新项目,推荐使用
node-fetch或axios这类维护活跃的库,下面给个node-fetch的示例:
const fetch = require('node-fetch'); async function verifyRecaptcha(recaptchaToken) { const SECRET_KEY = 'MY_SECRET'; try { const response = await fetch('https://www.google.com/recaptcha/api/siteverify', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ secret: SECRET_KEY, response: recaptchaToken }) }); const result = await response.json(); return result.success; } catch (error) { console.error('reCAPTCHA验证出错:', error); return false; } }
内容的提问来源于stack exchange,提问作者Chris Allinson
相关产品推荐
相关产品推荐

