Google Captcha v NodeJS

newCaptchaAnchor

Dříve jsem své formuláže zabezpečoval vlastními silami a to ještě kombinovaně jak na frontendu (JavaScriptové ověření požadovaného formuláře), tak pak na backendu, kam jsem si nějak přes POST přenášel data.
Doba pokročila a tak jsem se rozhodl vyzkoušet něco modernějšího a neplácat se s tím sám. A protože nově vyvíjená aplikace poběží hlavně asi na mobilech, tak jsem sáhl po reCAPTCHA přímo od Googlu.

Jak na to?

Nejdřív si musíte vygenerovat API klíče pro tuto službu. Nic složitého. Stačí zadat název domény a název služby. Generátor klíčů najdete zde.

Pak si vytvoříte vlastní HTML formulář, který chcete zabezpečit Google Captchou:

doctype html
html
  head
    script(src='https://www.google.com/recaptcha/api.js?hl=cs')
  body
    form(method='post' action='/registrace')
      .row
        .input-field.col.m6.s12
          input#email(name='email', type='email')
          label(for='email') Emailová adresa
      .row
        .input-field.col.m6.s12
          .g-recaptcha(data-sitekey="SEM-DEJ-VEREJNY-KLIC")
      .row
        .input-field.col.m6.s12
          button(type='submit')#login-btn.waves-effect.waves-light.btn Registrovat

Výsledek pak může vypadat takto nějak:
nejsem-robot_result
No a pak vám už jen zbývá ošetřit POST, kterým obsluhujete načítaný formulář.

var request = require('request');
const secret = 'SEM_DEJ_PRIVATNI_KLIC';
var gRecaptchaResponse = req.body['g-recaptcha-response'];
var googleURI = `https://www.google.com/recaptcha/api/siteverify?secret=${secret}&response=${gRecaptchaResponse}&remoteip=" + ${req.connection.remoteAddress}`;
request(googleURI, function(err, gRes, gBody) {
  var gdata = JSON.parse(gBody);
  var data = {
    email: req.body.email,
    spammer: gdata.success ? false : true
  };
  res.render('registrace-post', data);
});

Nejdřív se volá Googlovská služba, které se předává klíč k službe a odpoveď z formuláře. Služba vám na oplátku vráti info o tom, jestli formulář vyplnil člověk nebo ne.
Se získanou informací se dá pak dále pracovat, jedná se o boolean hodnotu. Já jí předávám dál do vykreslování nějaké odpovedi.