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の動作をテストする方法については、「探索的テスト」のセクションを参照してください。