node.jsでgoogle recaptcha v3の検証をする
クライアント側で取得したGoogle reCAPTCHA トークンの検証をNest.jsでやろうと思ったら、無駄にハマったのでメモ
tl;dr
データをapplication/x-www-form-urlencoded
で送れ
検証方法
公式のドキュメントで指定されているエンドポイントに対してPOSTでクライアントで取得したトークンとサーバーシークレットと一緒にリクエストする。
https://www.google.com/recaptcha/api/siteverify
ここで注意したいのは、ドキュメントには記載されていないがapplication/json
だと解釈してくれないのでapplication/x-www-form-urlencoded
で送る必要がある
Nest.jsのHttpModuleでは内部でaxiosが使われているので、axiosのドキュメントを参考にする
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()
リクエストが正常に処理された場合、result
にsuccess
という成功失敗のフラグや0〜1の間で表せられるscore
、error-codes
には失敗した場合の原因が入っています*2。例えばsecret
パラメーターが足りない場合などはmissing-input-secret
というエラーコードが入っています
*1:当然ですがfetchライブラリを使うなど別のhttp clientでも同じです
*2:https://developers.google.com/recaptcha/docs/verify#error_code_reference