node.js - Google nocaptcha post from server to siteverify says details are missing -


[ { hostname: 'www.google.com',     path: '/recaptcha/api/siteverify',     method: 'post',     headers: { 'content-type': 'application/json', 'content-length': 556 } },   '{"secret":"xxxusethisforcommunicationbetweenyoursiteandgooglexxx","response":"03ahj_vuusxdr5idgpnzqprjedgs-le066fx9r-lk1giflqlzwxappx70_lukmcosw3x-m2dsfpvqvylx060h9ijfp82fy7505_t_rjsivauiwbuyqprbmp5ktrviq_dd1l2mvmttrbieumlqm69aiug3kwmdoqmymjs2ijdrurnnvamdlpsejkasr4x-7c4iip3nomb52qsl9qpeu6kgaptxqmf1ipnwbsc3bzlxqd-qv1ai4ggaeqspfoo8epfisjmq5kbcd9wqawhqdaxmtnsvz10ty30r71hqmssk7yhddfqhei1l6y9j7nxny5qtaxhehhpywjvnji96hxeiag58_cqhgbaufy4apgalf-zj6be_xtdzd4anhxix9ouckqi8eqlh6dzlgaymxxdmpnu4tijgyyu0vetpttkf12zvug86_0zmszwzdtaljnnnxbh7bzqrgwxhy","remoteip":"00.00.000.000"}' ] 

if post , google returns this:

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

i don't see happening wrong

https://www.google.com/recaptcha/admin#site/xxxxxx?setup says:

when users submit form integrated recaptcha, you'll part of payload string name "g-recaptcha-response". in order check whether google has verified user, send post request these parameters: url: https://www.google.com/recaptcha/api/siteverify secret(required) - xxxxxx, response(required) - value of 'g-recaptcha-response', remoteip - end user's ip address.

i have sent these things! happening here? the error not wrong, says 'missing'

and above quoted text google says post not google recaptcha: how user response , validate in server side

but if try request response [ null, 400, undefined ]

update

as @mscdex pointed out application/x-www-form-urlencoded required responce still said missing secret url encoded instead figured bad may happening item @ start of object.

{'_':'_','secret':'xxxxxx','response':'whateverxxysgtsg','remoteip':'00.00.000.000'} 

and worked:

[ { hostname: 'www.google.com',     path: '/recaptcha/api/siteverify?',     method: 'post',     headers:       { 'content-type': 'application/x-www-form-urlencoded',        'content-length': 548 } },   '"_=_&secret=xxxxxx&response=03ahj_vuurqfgsftybllvrdgowxfnnewp4v7fpjjbod9cgpihakfbainy7ywxchraku6spu5uzpgkcptu3grx5opqxeh2qqp3nxjpibwoxfw_iv05p2ua23rzzzk0ecscmmsl1pp1uybcdj08hpaweuz2pzl6m6u71k09xqbvbpz5kt6qnb-mdpnyekdbxtc9a5oypnoohg7ax6q4ms4lis4qrnblcavkmyz6vamyitsei0a0gernli3wlsvayhc-yygv1kokijg2q8ghxv1uhklzba8t8x2ibrbnwxumbfs3qj_lfwgitntiau3keafpuljulzdosacovkpjk5xkymm2c5ydgymioeyoml9zmyyvkwfrrre8e9o_td6sattsacrcxsfygm-w0_cdbsa2iwskjimn-2b9sclozjgxxvxviuiyclik3xuuvtsobczxjaq2ikwwmttyx&remoteip=00.00.000.000"' ] [ { success: true }, 200, undefined ] 

but not hacky if can answer how swell!

var json={         https:require('https')     ,   toquery:require('../node_modules/querystring').stringify     ,   stringify:require('../node_modules/json-stringify-safe')     ,   parse:require('../node_modules/try-json-parse')     ,   get:function(url,callback){process.env.node_tls_reject_unauthorized="0";var req=json.https.request(url,function(res){var buffer='';res.setencoding('utf8');res.on('data',function(chunk){buffer+=chunk;});res.on('end',function(){try{var data=json.parse(buffer);callback(data,res.statuscode);}catch(e){console.log(e);}});});req.end();}     ,   post:function(url,path,data,type,callback){if(!callback){callback=type;type=undefined;}data=json.stringify(data);var options={hostname:url,path:path,method:'post',headers:{'content-type':type||'application/json','content-length':data.length}};console.dir([options,data]);var req=json.https.request(options,function(res){var buffer='';res.setencoding('utf8');res.on('data',function(chunk){buffer+=chunk;});res.on('end',function(){try{var data=json.parse(buffer);callback(data,res.statuscode);}catch(e){console.log(e);}});});req.write(data);req.end();}         };  json.post(         'www.google.com'     ,   '/recaptcha/api/siteverify?'     ,   json.toquery({'_':'_','secret':'xxxx','response':response,'remoteip':remoteip})     ,   'application/x-www-form-urlencoded'     ,   function(data,result,statuscode){             console.dir([data,result,statuscode]);             if(result.success){}             else{}             }); 

here how in 1 of project using superagent. recaptcha-helper.js

var request = require("superagent");  var config = {   recaptcha: {     secret: "xxxxx",     url: "https://www.google.com/recaptcha/api/siteverify",   }, };  var error_codes = {   "missing-input-secret": "unexpected server error (1)",   "invalid-input-secret": "unexpected server error (2)",   "missing-input-response": "missing recaptcha value",   "invalid-input-response": "invalid recatpcha value", };  exports.geterrorcode = function (errorcode) {   if (array.isarray(errorcode)) {     var errors = errorcode.map(function (code) {       return exports.geterrorcode(code);     });     return errors.join("\n");   }   return error_codes[errorcode] ||     (errorcode ? ("unexpected recaptcha error: " + errorcode) : "unexpected recaptcha error"); };  exports.parseresponse = function (err, res) {   if (err) {     return { success: false, error: err };   } else if (!res.body.success) {     var error = new error(exports.geterrorcode(res.body["error-codes"]));     return { success: false, error: error };   } else {     return { success: true };   } };  exports.verify = function (response, ip) {   if (process.env.node_env === "test") {     return response ? promise.resolve() :       promise.reject(new error("test recaptcha error"));   }    return new promise (function (resolve, reject) {     request.post(config.recaptcha.url)     .type("form")     .accept("json")     .send({       secret: config.recaptcha.secret,       response: response,       remoteip: ip,     })     .end(function (err, res) {       var parsedres = exports.parseresponse(err, res);       return parsedres.success ? resolve() : reject(parsedres.error);     });   }); }; 

and can use doing

var captchahelper = require('./recaptcha-helper');  captchahelper.verify(req.body.captcha, req.ip)   .then(function () {     // on success   }).catch(function (err {    // on error   }); 

Comments