const querystring = require('querystring'); const https = require('https'); exports.validate = function(options) { const secret = this.parseRequired(options.secret, 'string', 'recaptcha.validate: secret is required.'); const msg = this.parseOptional(options.msg, 'string', 'Recaptcha check failed.'); const response = this.req.body['g-recaptcha-response']; const remoteip = this.req.ip; const data = querystring.stringify({ secret, response, remoteip }); return new Promise((resolve, reject) => { const req = https.request('https://www.google.com/recaptcha/api/siteverify', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': data.length } }, (res) => { let body = ''; res.setEncoding('utf8'); res.on('data', (chunk) => body += chunk); res.on('end', () => { if (res.statusCode >= 400) return reject(body); if (body.charCodeAt(0) === 0xFEFF) { body = body.slice(1); } body = JSON.parse(body); if (!body.success) { this.res.status(400).json({ form: { 'g-recaptcha-response': msg } }); } resolve(body); }); }); req.on('error', reject); req.write(data); req.end(); }); };