GraphQL APIスパム保護とCAPTCHAサポート
モデルを GraphQL API 経由で変更できる場合、スパム可能またはスパム関連の属性を変更する可能性のある、関連するすべての GraphQL 変異へのサポートも追加する必要があります。これにはCreate およびUpdate 変異が確実に含まれますが、モデルの機密/公開フラグの変更に関連するものなど、他のものも含まれる可能性があります。
GraphQL変異にサポートを追加
主な手順は以下の通りです:
- 変異にはinclude Mutations::SpamProtectionを使用します。
- Update Service クラスのコンストラクタにperform_spam_check: trueを渡します。Create Serviceでは、デフォルトでtrue。
- 
Spammableモデル・インスタンスを作成または更新したら、#check_spam_action_response!を呼び出し、モデル・インスタンスを渡します。この呼び出しは- モデルに必要なスパムチェックを行います。
- スパムが検出された場合
- 
GraphQL::ExecutionError例外が発生します。
- 
extensions:パラメーター経由でレスポンスにエラー フィールドとして追加された関連情報を含みます。これらのフィールドの詳細については、GraphQL API ドキュメントの「スパムとして検出された変異を解決する」のセクションを参照してください。
 
- 
 上記の標準的な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の動作をテストする方法については、「探索的テスト」のセクションを参照してください。
