Implementando integração com Google reCAPTCHA

Para proteger os formulários públicos de uma aplicação de serem bombardeados com spam, normalmente colocamos um recaptcha.

Primeiramente precisamos ir até a página https://www.google.com/recaptcha/admin/create para criar as chaves de segurança.

Preencha o formulário com os dados solicitados e clique em submit. Sobre o tipo de reCAPTCHA, a diferença entre a V2 e V3 é que a V3 apresenta um desafio, enquanto a V2 é aquela que só verifica se não é uma pessoa.

Na próxima página, serão exibidas duas chaves de segurança. A primeira será inserida no frontend e a segunda no backend.

Para o frontend, acima da chave tem um link explicando como realizar a integração. Caso fique alguma dúvida nessa parte, deixe um comentário aqui no post que ajudo você 😉.

Com a segunda chave em mãos (chave para o backend), vamos implementar a nossa integração.

Caso você esteja usando uma struct para fazer o parse das informações do formulário submetido, adicione o seguinte campo a ela.

GreCaptcha string `json:"-" form:"g-recaptcha-response"`

Dessa forma, o token do google recaptcha que é submetido no formulário já ficará disponível para ser usado junto ao objeto parseado.

Esse token será submetido junto com a chave secreta do backend para um endpoint da Google. Esse endpoint irá retornar uma resposta com alguns campos. Para facilitar nossa vida, vamos criar uma struct para lidar com os campos que nos interessam dessa resposta.

type RecaptchaResponse struct {
    Success bool     `json:"success"`
    Errors  []string `json:"error-codes"`
}

Agora vamos escrever uma função que irá se encarregar de fazer algumas validações e retornar um booleano, onde true significa que houve sucesso na verificação do recaptcha e false que houve algum problema.

const GRC_URL = "https://www.google.com/recaptcha/api/siteverify"

func verifyRecaptcha(token string) bool {
    if token == "" {
        return false
    }

    resp, err := http.PostForm(GRC_URL, url.Values{"secret": {"CHAVE-SECRETA"}, "response": {token}})
    if err != nil {
        log.Printf("error: %v", err)
        return false
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Printf("error: %v", err)
        return false
    }

    var rr RecaptchaResponse
    err = json.Unmarshal(body, &rr)
    if err != nil {
        log.Printf("error: %v", err)
        return false
    }

    return rr.Success
}

Tudo o que você precisa fazer agora é passar o campo GreCaptcha da sua struct para essa função e validar seu retorno.

Caso você tenha algum problema ou dificuldade em realizar essa integração ao seu código, deixe sua dúvida nos comentários que eu ajudo 🤓.

Espero que tenha ajudado e até a próxima!


Subscreva

Fique por dentro de tudo o que acontece no mundo Go.

Deixe uma resposta