登録ページを自動送信から保護したいので、reCaptcha v3を試すことにしました。これはAngularアプリケーションであり、統合を容易にするために ng-recaptcha モジュールを使用しています。Stackblitzで基本的な例を設定し、オンラインでテストできるようにしています:
https://stackblitz.com/edit/angular-qk3jhr
私にはいくつかの疑問/問題があります:
app.module.ts
ファイル、送信ボタンを押すと、this.recaptchaV3Service.execute
呼び出しは何もしません。これは、アプリがreCaptcha V3キーの生成時に指定したドメインにないためですか?また、間違ったキーを書き込んだ場合、Googleは次のエラーを表示します。エラー:無効なサイトキーまたはapi.jsに読み込まれていません:
前もって感謝します、
最後に、いくつかのことを試す時間を得て、どうにかしてそれを機能させることができました。基本的に、私がしたことは:
1テスト用のキーのペアを生成します(ドメインで「localhost」を設定)。
2クライアントアプリで、ng-recaptcha
そのページで説明されているモジュール( https://www.npmjs.com/package/ng-recaptcha#recaptcha-v3-usage-see-in-action )。次に、ユーザー保護コンポーネント(保護したい)から、[送信]ボタンを押すと次のコードが実行されます。
public beforeSubmittingForm(): void {
this.recaptchaV3Service.execute('registerSubmit').subscribe(
(token) => {
// 'this.user' contains the data of the user we want to create. Add the received token
this.user.recaptchav3_token = token;
this.submitForm(); // This sends the user data to the backend
},
(error) => {
this.errors = [ 'Error trying to verify request (reCaptcha v3)' ];
});
}
3バックエンドのユーザー登録ルートで、axios
ライブラリ( https://www.npmjs.com/package/axios )を使用してPOST受信したトークンを使用したGoogle検証サービスへのリクエスト:
try {
var result = await axios.post("https://www.google.com/recaptcha/api/siteverify", {}, {
params: {
secret: recaptcha_api_key, // Secret API key
response: req.body.recaptchav3_token // Received token from the frontend
}
});
if(result.score < 0.5) {
return res.status(403).json({ msg: 'Google Recaptcha error' });
}
} catch(e) {
return res.status(403).json({ msg: 'Error trying to verify the request' });
}
// Continue with the registration process...
よろしくお願いいたします。
最初の質問が理解できるかわかりません。無効なキーを使用すると、そのエラーが発生することが予想されます。正しいドメインに正しいキーを使用する場合は、トークンを生成する必要があります。
2番目の質問については、ngOnInit()
メソッドでトークンを生成しているため、preSubmitForm()
の実行中にトークンを生成する必要はなく、それで十分です。トークンをどうするかについては、それを残りのフォームデータと共にサーバーに投稿する必要があります。次に、フォーム送信が処理されるサーバー側コードで、トークンと秘密鍵の両方を提供するrecaptcha APIにリクエストを送信します。
サーバー側の検証に関しては GoogleのreCaptchaドキュメント をご覧ください。