Как исправить эту лямбда-функцию AWS для Google reCaptcha?

1

У меня есть лямбда-функция, которую я пытаюсь использовать для проверки 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>
Теги:
amazon-web-services
express
aws-lambda

1 ответ

0

Не уверен, что это решит всю вашу проблему, но я заметил, что ваш обратный вызов не работает правильно в функции validateRecaptcha:

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

В вашем случае функция, через которую вы проходите, - это function(err, response){...}

В блоке if в случае успеха вы вызываете функцию обратного вызова с ответом в качестве первого аргумента, где первый аргумент назначен для ошибки.

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

Вам нужно будет изменить это на

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

Надеюсь, это продвинет вас немного дальше

Ещё вопросы

Сообщество Overcoder
Наверх
Меню