REST API 스팸 방지 및 CAPTCHA 지원

모델이 REST API를 통해 수정 가능한 경우, 스팸 또는 스팸 관련 속성을 수정할 수 있는 관련 API 엔드포인트도 지원해야 합니다. 이는 POSTPUT 뮤테이션을 확실히 포함하지만, 모델의 기밀/공개 플래그를 변경하는 등 다른 경우도 포함될 수 있습니다.

REST 엔드포인트에 지원 추가

주요 단계는 다음과 같습니다:

  1. resourcehelpers SpammableActions::CaptchaCheck::RestApiActionsSupport를 추가합니다.
  2. Update 서비스 클래스 생성자에 perform_spam_check: true를 전달합니다. 생성 서비스에서는 기본적으로 true로 설정됩니다.
  3. Spammable 모델 인스턴스를 생성하거나 업데이트 한 후, #check_spam_action_response!를 호출하여 생성하거나 업데이트한 인스턴스를 변수에 저장합니다.
  4. 요청의 failure 케이스에 대한 오류 처리 로직을 식별합니다. 이는 만약 생성 또는 업데이트에 실패한 경우 가능한 스팸 감지를 나타내며, 이는 Spammable 인스턴스에 오류를 추가합니다. 이 오류는 일반적으로 render_api_error! 또는 render_validation_error!와 유사합니다.
  5. 기존 오류 처리 로직을 with_captcha_check_rest_api(spammable: my_spammable_instance) 호출로 래핑합니다. 이때 spammable: 이름있는 인자로 변수에 저장한 Spammable 모델 인스턴스를 전달합니다. 이 호출은 다음과 같은 작업을 수행합니다:
    1. 모델에서 필요한 스팸 확인을 수행합니다.
    2. 스팸이 감지되면:
      • 설명적인 스팸 특정 오류 메시지와 함께 Grape #error! 예외를 발생시킵니다.
      • 응답에 오류 필드로 추가된 관련 정보를 포함시킵니다. 이러한 필드에 대한 자세한 내용은 REST API 문서의 스팸으로 감지된 요청 해결 부분을 참조하십시오.
    note
    표준 ApolloLink 또는 Axios 인터셉터 CAPTCHA 지원을 사용하는 경우 위의 필드 세부 정보는 무시할 수 있습니다. 왜냐하면 이러한 것들은 자동으로 처리되기 때문에 눈에 띄게되고 있습니다. 이것들은 만약 잠재적인 스팸을 체크하고 해결된 CAPTCHA 응답으로 요청을 다시 제출하려고 GraphQL API를 직접 사용하려고 하는 경우에 유효해집니다.

snippets 리소스에 대한 postput 액션에 대한 예시는 다음과 같습니다:

module API
  class Snippets < ::API::Base
    #...
    resource :snippets do
      # 이 헬퍼는 `#with_captcha_check_rest_api`를 제공합니다
      helpers SpammableActions::CaptchaCheck::RestApiActionsSupport