如何修复此AWS Lambda函数for Google reCaptcha?

时间:2017-06-05 08:47:28

标签: javascript node.js amazon-web-services express aws-lambda

我有一个lambda函数,我试图用来验证google recaptcha。我知道我从客户端发送了正确的数据,这是响应,但我一直收到验证失败的控制台消息。 这是我的代码:

//Lambda Function I am using
var AWS = require('aws-sdk');
const https = require('https');
const googleRecapchaSecret = "<site-secret-key>";
/* 
  Sample response query string
  https://www.google.com/recaptcha/api/siteverify?secret=your_secret&response=response_string
*/
function validateRecaptcha(recaptchaResponse,  callback, error){
    var querystring = require('querystring');    
    var postData = querystring.stringify({secret : googleRecapchaSecret,response : recaptchaResponse});
    var options = {
       hostname: 'www.google.com',
       path: '/recaptcha/api/siteverify',
       method: 'POST',
       port: 443, 
       headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
        }
      
    };   
  
   var req = https.request(options, (res) => {
        res.on('data', (d) => {
             if (d === undefined){ error('undefined'); return}
             
             var response = JSON.parse(d);
             console.log(response);
             if(response.success === true){
                 callback('true');
             }else{
                 callback(response);
             }
        });
   });  
  
   req.write(postData);
   req.end();
   
   req.on('error', (e) => {
       //console.log(e);
       callback('false');
   });
   
}
module.exports.grouveReCaptcha =  (event, context, callback) => {
    data = event;
    if(data.body === undefined) { context.fail('Must provide parameters!'); return; }
    console.log('Received Event:',data.body);
    
    
   if(recaptchaResponse === undefined){ 
        context.fail('Recaptcha cannot be validated!'); 
        return;
    }
    var recaptchaResponse = event.body.data;

    validateRecaptcha(recaptchaResponse, function(err, data){      
        if (err) {
          console.log("ReCAPTCHA verification failed!");
	        callback(null, {'success': false, 'message': "You appear to be a robot!"});
			    context.done(err, null);
        } else {
            console.log("ReCAPTCHA verification succeeded!");
            context.done(null, data);
        }
    });
  
};

这是我在客户端使用的html:

<script type="text/javascript">
  var onloadCallback = function() {
    grecaptcha.render('quote-g-recaptcha', {
      'sitekey': 'XXXXXXXXXXXXXXXXXXXX',
      'callback': verifyCallback
    });
  };
</script>

<div class="g-recaptcha" id="quote-g-recaptcha" style="transform:scale(0.77);-webkit-transform:scale(0.77);transform-origin:0 0;-webkit-transform-origin:0 0;"></div>
<script type="text/javascript">
  var verifyCallback = function(response) {
    AWS.config.update({
      region: 'us-east-1'
    });
    AWS.config.credentials = new AWS.Credentials('XXXXXXXXX', 'XXXXXXXXX');
    var lambda = new AWS.Lambda({
      region: 'us-east-1',
      apiVersion: '2015-03-31'
    })
    var pullReCaptchaParams = {
      FunctionName: 'ReCaptchaGrouve',
      InvocationType: 'RequestResponse',
      LogType: 'Tail',
      Payload: JSON.stringify({
        response
      })
    };
    lambda.invoke(pullReCaptchaParams, function(error, data) {
      if (error) {
        prompt(error);
      } else {
        pullReCaptchaResults = JSON.parse(data.Payload);
        console.log('User Verified');
      }
    });
    var pullReCaptchaResults;
  };
</script>

1 个答案:

答案 0 :(得分:1)

不确定这是否会解决您的整个问题,但我注意到您的回调在validateRecaptcha函数中无法正常工作:

 if(response.success === true){
     callback('true');
 }else{
     callback(response);
 }

在您的情况下,您要通过的功能是function(err, response){...}

在成功的if块中,您调用带有响应的回调作为第一个参数,其中第一个参数被分配给err。

function(err, response) {
  // err is set to the first argument
  // response will be undefined
}

您需要将其更改为

if(response.success === true){
    callback(null, response);
}else{
    callback(response);
}

希望这会让你更进一步