GraphQL APIスパム保護とCAPTCHAサポート

モデルを GraphQL API 経由で変更できる場合、スパム可能またはスパム関連の属性を変更する可能性のある、関連するすべての GraphQL 変異へのサポートも追加する必要があります。これにはCreate およびUpdate 変異が確実に含まれますが、モデルの機密/公開フラグの変更に関連するものなど、他のものも含まれる可能性があります。

GraphQL変異にサポートを追加

主な手順は以下の通りです:

  1. 変異にはinclude Mutations::SpamProtection を使用します。
  2. Update Service クラスのコンストラクタにperform_spam_check: true を渡します。Create Serviceでは、デフォルトでtrue
  3. Spammable モデル・インスタンスを作成または更新したら、#check_spam_action_response! を呼び出し、モデル・インスタンスを渡します。この呼び出しは
    1. モデルに必要なスパムチェックを行います。
    2. スパムが検出された場合
      • GraphQL::ExecutionError 例外が発生します。
      • extensions: パラメーター経由でレスポンスにエラー フィールドとして追加された関連情報を含みます。これらのフィールドの詳細については、GraphQL API ドキュメントの「スパムとして検出された変異を解決する」のセクションを参照してください。
    note
    上記の標準的なApolloLinkまたはAxiosインターセプターのCAPTCHAサポートを使用する場合、フィールドの詳細は自動的に処理されるため、無視することができます。これらは、GraphQL APIを直接使用して潜在的なスパムのチェックに失敗した処理を行い、解決されたCAPTCHAレスポンスでリクエストを再送信しようとした場合に関係します。

使用例:

module Mutations
  module Widgets
    class Create < BaseMutation
      include Mutations::SpamProtection

      def resolve(args)
        service_response = ::Widgets::CreateService.new(
          project: project,
          current_user: current_user,
          params: args
        ).execute

        widget = service_response.payload[:widget]
        check_spam_action_response!(widget)

        # If possible spam was detected, an exception would have been thrown by
        # `#check_spam_action_response!`, so the normal resolve return logic can follow below.
      end
    end
  end
end

GraphQL APIでCAPTCHAの動作をテストする方法については、「探索的テスト」のセクションを参照してください。