ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

node.jsでgoogle recaptcha v3の検証をする

クライアント側で取得したGoogle reCAPTCHA トークンの検証をNest.jsでやろうと思ったら、無駄にハマったのでメモ

tl;dr

データをapplication/x-www-form-urlencodedで送れ

検証方法

公式のドキュメントで指定されているエンドポイントに対してPOSTでクライアントで取得したトークンとサーバーシークレットと一緒にリクエストする。

https://www.google.com/recaptcha/api/siteverify

developers.google.com

ここで注意したいのは、ドキュメントには記載されていないがapplication/jsonだと解釈してくれないのでapplication/x-www-form-urlencodedで送る必要がある

Nest.jsのHttpModuleでは内部でaxiosが使われているので、axiosのドキュメントを参考にする

github.com

sample

以下Nest.jsのHttpModule*1を使用したサンプル

import * as qs from 'querystring'

const data = {
  secret: '',// google  recaptchaのサイトで見れるサーバーシークレット
  response: token, // クライアントで生成したトークン
}

const result = await this.httpService
  .post(
    'https://www.google.com/recaptcha/api/siteverify',
    qs.stringify(data),
  ).toPromise()

リクエストが正常に処理された場合、resultsuccessという成功失敗のフラグや0〜1の間で表せられるscoreerror-codesには失敗した場合の原因が入っています*2。例えばsecretパラメーターが足りない場合などはmissing-input-secretというエラーコードが入っています

*1:当然ですがfetchライブラリを使うなど別のhttp clientでも同じです

*2:https://developers.google.com/recaptcha/docs/verify#error_code_reference