2017-06-05 20 views
1

我有一個lambda函數,我試圖用來驗證google recaptcha。我知道我從客戶端發送了正確的數據,這是響應,但我一直收到驗證失敗的控制檯消息。 這裏是我的代碼:如何爲Google reCaptcha修復此AWS Lambda功能?

//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!"); 
 
\t   callback(null, {'success': false, 'message': "You appear to be a robot!"}); 
 
\t \t \t  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': '6LexBSQUAAAAAC_cimQqwFkJ-833td9V3gMDUIZM', 
 
     '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('AKIAIPE54LWXYNXASZTQ', 'G3UHubDlKEtVN+zY2ycoUNeRpDcGO734i1Vf7xj0'); 
 
    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>

回答

0

不知道這是否會解決你的整個問題,但我注意到你的回調不是工作王正確的validateRecaptcha功能:

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

在你的情況,你是通過功能函數(ERR,響應){...}

在如果成功塊,您正在調用回調將第一個參數賦值給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); 
} 

希望這可以讓你遠一點