설계 토큰 인증 가이드: Rails API의 간단한 인증

Rails API를 위한 인증 시스템을 만들고 싶지만 API(클라이언트 없음)에 대한 한 가지는 세션이나 쿠키를 사용하여 인증할 수 없다는 것입니다.
그래서 나는gem devise_token_auth 을 사용했는데 그것은 토큰을 사용한다.간단하게 말하면, 이것은 이렇게 작동합니다. HTTP 요청을 등록하거나 로그인할 때, 응답 헤더는 인증 영패를 줍니다. 인증이 통과되었음을 증명하기 위해 다음 HTTP 요청 헤더에 이 영패를 보낼 수 있습니다.
비록 official docs은 당신이 필요로 하는 대부분의 정보를 제공했지만 몇 가지 저는 매우 곤혹스러워서 본문을 장래에 참고로 남깁니다.도움이 됐으면 좋겠어요!
참고 이 안내서는 Linux 또는 MacOS에 적용됩니다.

구현 단계


제가 만든 repository 나체 골격도 마음대로 보시고 이 보석을 어떻게 사용하는지 개념적으로 증명해 주십시오.

1. devise\u token_auth 설치

Gemfile에 다음 내용을 추가한 다음 명령줄에서 bundle을 실행합니다.
gem 'devise_token_auth'

2. 필요한 파일 생성


명령줄에서 이 작업을 수행합니다.
rails g devise_token_auth:install User auth
이것은 다음과 같은 많은 일을 할 것이다.
  • User 모델을 만들고 이 모델은 사용자의 전자 우편 주소 등 정보를 저장하며 해당하는 이전 파일
  • config/routes.rb 파일에 한 줄을 추가하여 등록이나 로그인 등 인증 노드의 루트를 지정합니다(/auth/ 이외의 다른 곳으로 루트를 원한다면 명령의'auth'을 다른 내용과 교환하십시오).
  • 이 명령 기능에 대한 자세한 목록은 docs을 참조하십시오.

    현대화하다


    Rafael 아래 설명에 따라 생성된 extend Devise::Models 모델 파일에 User을 추가할 필요가 있습니다.자세한 내용은 Github issue을 참조하십시오.

    Rafael Oliveira
    github

    http://www.w3.org/TR/REC-html40/loose.dtd">
    안녕하세요.
    좋은 댓글은 다음과 같은 문장만 추가합니다. "확장 디자인::Models"사용자의 모델을 시작합니다. 디자인\utoken_auth 설치 후.이것은 rails 버전 6이다.
    기타 기능:)

    3. 데이터베이스 마이그레이션


    명령줄에서 rails db:migrate을 실행하여 단계 # 2에서 만든 마이그레이션 파일을 적용하면 db/migrate/YYYYMMDDTTTT_devise_token_auth_create_users.rb처럼 보일 수 있습니다.

    4. 초기값 설정 항목 파일 구성

    config/initializers/devise_token_auth.rb 파일로 이동합니다(단계 # 2의 rails g 명령에서도 생성).
    마찬가지로 docs에는 사용자가 구성할 수 있는 전체 목록이 있습니다. 예를 들어 다음과 같습니다.
    config.change_headers_on_each_request = false
    
    기본적으로 권한 수여 헤더는 모든 요청에 따라 달라집니다.이것은 모든 요청에서 새 영패를 되돌려주고 매번 다른 영패를 되돌려야 한다는 것을 의미합니다.나는 같은 영패를 계속 사용할 수 있기를 희망하기 때문에, 나는 그것을 false으로 설정하여 닫았다.
    영패를 다시 사용하는 것은 최선의 안전 실천이 아니기 때문에 매번 생산에서 새 영패를 사용하는 것이 더 좋을 것이다.

    5. JSON에서 요청한 위조 보호 비활성화


    Rails 컨트롤러는 크로스 사이트 요청(CSRF) 공격에 대한 사전 설정 조치를 갖추고 있습니다.이는 HTML에 표시되는 토큰과 Rails가 세션에 자동으로 저장되는 토큰을 비교하는 것과 관련이 있지만 API에 대해서는 세션이 없고 자체 토큰을 사용하기 때문에 필요 없음(here).

    It's important to remember that XML or JSON requests are also affected and if you're building an API you should change forgery protection method in ApplicationController (by default: :exception)


    따라서 계속해서 app/controllers/application_controller.rb에서 JSON 형식 요청의 위조 검사를 사용하지 마십시오.
    참고 이 작업은 모든 요청이 API를 통해 전송된 경우에만 수행됩니다.
    class ApplicationController < ActionController::Base
      protect_from_forgery unless: -> { request.format.json? }
    end
    

    주의사항

  • 이 단계를 건너뛰면 다음과 같은 오류가 발생합니다. ActionController::InvalidAuthenticityToken in DeviseTokenAuth::RegistrationsController#create.
  • ApplicationControllerActionController::API에서 상속된 경우 (--api 로고를 사용하여 프로젝트를 초기화하는 경우 이 절차를 수행할 필요가 없습니다. 기본적으로 위조 보호가 없기 때문입니다.
  • 6. 사용자 등록 시도


    이제 테스트 사용자를 등록해 봅시다.rails s을 사용하여 명령줄에서 Rails 서버를 시작하고 다음 매개 변수를 사용하여 localhost:3000/auth/(또는 사용자 정의 라우팅)에 HTTP POST 요청을 보냅니다.
    {
      "email": "[email protected]",
      "password": "password",
      "password_confirmation": "password"
    }
    
    그것은 반드시 상태 200-성공으로 돌아가야 한다.현재 당신의 신분 검증 시스템이 작동합니다!

    7. 컨트롤러에 인증 추가


    다음 컨트롤러 파일에 필요한 인증을 위한 줄을 추가합니다.예를 들어 우리가 책 정보를 저장하는 데이터베이스에 API를 구축하고 있다고 가정하자.데이터베이스에서 책을 추가하거나 삭제하는 데 사용할 books_controller.rb 파일이 있습니다.사용자가 항목을 추가하거나 삭제하기 전에 인증하기를 원합니다.
    class BooksController < ApiController
      before_action :authenticate_user!
    
      # Code for methods such as create and delete should come here.
    end
    
    이제 books 컨트롤러의 모든 방법에 HTTP 요청을 보낼 때마다 인증을 거치지 않으면 오류가 발생합니다.

    실제 사용 상황


    앞서 언급한 바와 같이 등록 사용자의 HTTP 요청은 localhost:3000/auth/에 대한 POST 요청입니다.방법의 전체 목록(예를 들어 로그인/로그아웃 사용자 및 암호 변경)에 대해서는 docs을 참조하십시오.필요한 요청 유형, 라우팅 및 매개변수를 볼 수 있습니다.
    마지막으로 실제 사용 상황을 이야기합시다.다음은 관련 절차입니다.
  • 인증 요청 보내기(등록 또는 로그인)
  • 상태 200 반환, 헤더
  • 에 유효한 인증 영패 포함
  • 다음 요청에서 이 영패를 표지판
  • 에 발송합니다
    필요한 영패 종류는 다음과 같습니다.
  • 방문 영패
  • 클라이언트
  • uid
  • 이렇게 간단해!
    나는 또 테스트 기교를 토론하고 싶지만, 편폭이 갈수록 길어지기 때문에, 나는 다른 글에서 소개할 것이다.감사합니다:)

    현대화하다


    테스트에 관한 글입니다!


    추가 업데이트

    trackable 모듈은 devisegem에서 삭제된 것 같습니다. devise_token_auth은 이gem를 기반으로 합니다.따라서 User 모델의 기본 구성(:trackable 포함)은 다음과 같은 오류를 일으킬 수 있습니다. NoMethodError: undefined method 'current_sign_in_at'.
    이 문제를 해결하는 방법에 대한 자세한 내용은 다음 링크를 참조하십시오.
  • https://stackoverflow.com/questions/55735895/nomethoderror-undefined-method-current-sign-in-at-for-user0x000055ce01dcf0a
  • https://www.bountysource.com/issues/75245078-cant-log-in-nomethoderror-undefined-method-current_sign_in_at-for-user-0x000055e053c79c58
  • 좋은 웹페이지 즐겨찾기