Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

47 řádky
1.5 KiB

  1. const querystring = require('querystring');
  2. const https = require('https');
  3. exports.validate = function(options) {
  4. const secret = this.parseRequired(options.secret, 'string', 'recaptcha.validate: secret is required.');
  5. const msg = this.parseOptional(options.msg, 'string', 'Recaptcha check failed.');
  6. const response = this.req.body['g-recaptcha-response'];
  7. const remoteip = this.req.ip;
  8. const data = querystring.stringify({ secret, response, remoteip });
  9. return new Promise((resolve, reject) => {
  10. const req = https.request('https://www.google.com/recaptcha/api/siteverify', {
  11. method: 'POST',
  12. headers: {
  13. 'Content-Type': 'application/x-www-form-urlencoded',
  14. 'Content-Length': data.length
  15. }
  16. }, (res) => {
  17. let body = '';
  18. res.setEncoding('utf8');
  19. res.on('data', (chunk) => body += chunk);
  20. res.on('end', () => {
  21. if (res.statusCode >= 400) return reject(body);
  22. if (body.charCodeAt(0) === 0xFEFF) {
  23. body = body.slice(1);
  24. }
  25. body = JSON.parse(body);
  26. if (!body.success) {
  27. this.res.status(400).json({
  28. form: { 'g-recaptcha-response': msg }
  29. });
  30. }
  31. resolve(body);
  32. });
  33. });
  34. req.on('error', reject);
  35. req.write(data);
  36. req.end();
  37. });
  38. };