reCAPTCHA-エラーコード:ユーザーの応答を検証するときの「missing-input-response」、「missing-input-secret」(POSTの詳細がない)

Uウェイ:

Webアプリケーションに非表示のreCAPTCHA設定していますが、ユーザーの応答を確認できません(私は正しいPOSTパラメータを渡していますが)

grecaptcha.execute();クライアント側で呼び出すことにより、プログラムでチャレンジを呼び出しています。その後registrationForm.submit();、recaptchaコールバックを使用してフォームを送信します)。

<div class="g-recaptcha"
  data-sitekey="SITE_KEY"
  data-callback="onSubmit"
  data-size="invisible">
</div>

「ユーザーの応答の確認」のドキュメントを読んだ後、応答トークンがPOSTパラメータとしてに渡されることを理解しましたg-recaptcha-response

Webユーザーの場合、次の3つの方法のいずれかでユーザーの応答トークンを取得できます。

  • ユーザーがサイトでフォームを送信するときのg-recaptcha-response POSTパラメーター
  • ...

したがって、私はFetchを使用して、サーバー側で必要な本文データを含む検証エンドポイントへのPOSTリクエストを作成しています

verify(req, res, next) {
  const VERIFY_URL = "https://www.google.com/recaptcha/api/siteverify";

  return fetch(VERIFY_URL, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      secret:   process.env.RECAP_INVIS_SECRET_KEY,
      response: req.body['g-recaptcha-response'],
    }),
  })
  .then(response => response.json())
  .then(data => {
    res.locals.recaptcha = data;
    return next();
  });
}

しかし、私は次の応答を受け取り続けます:

{成功:false、エラーコード:['missing-input-response'、 'missing-input-secret']}

応答とシークレットをJSONデータとしてPOST本体で渡していますが。

私は何か間違ったことをしていますか?よろしく。

Uウェイ:

reCaptcha Googleフォーラムを少し調査して掘り下げてみると、このエンドポイントはデフォルトのコンテンツタイプしか受け入れないようです。application/x-www-form-urlencoded

つまり、JSONを使用して応答トークンとサイトキーを送信しないでください。代わりに、application/x-www-form-urlencoded定義された方法として値を送信します

このコンテンツタイプで送信されるフォームは、次のようにエンコードする必要があります。

  1. コントロールの名前と値はエスケープされます。[RFC1738]のセクション2.2で説明されているように、スペース文字は「+」で置き換えられ、予約文字はエスケープされます。非英数字は、「%HH」、パーセント記号、およびASCIIコードを表す2つの16進数で置き換えられます。キャラクター。改行は「CR LF」ペア(つまり、「%0D%0A」)として表されます。
  2. コントロールの名前/値は、ドキュメントに表示される順序でリストされています。名前は値と「=」で区切られ、名前と値のペアは「&」で相互に区切られます。

したがって、URL(クエリ文字列)を介してPOSTパラメータを渡し、それをPOSTリクエストとして送信するという、2つの方法があります。

https://www.google.com/recaptcha/api/siteverify?secret=${SECRET_KEY}&response=${req.body['g-recaptcha-response']}

または、次のように手動でデータを本文に追加します。

verify(req, res, next) {
  const VERIFY_URL = "https://www.google.com/recaptcha/api/siteverify";

  return fetch(VERIFY_URL, {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: `secret=${SECRET_KEY}&response=${req.body['g-recaptcha-response']}`,
  })
  .then(response => response.json())
  .then(data => {
    res.locals.recaptcha = data;
    return next();
  });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章