Devise의 기능을 사용자 정의하는 방법(예: SNS 계정으로 로그인한 경우 비밀번호 재발행을 방지)

8569 단어 RailsOmniAuthdevise

배경



Devise를 사용하여 로그인 기능을 만들고,
그리고 Google 로그인과 Github 로그인을 만들었습니다.
(물론 구그는 코피페하면서! devise와 omniauth를 사용한 Google 인증 흐름 를 참고했습니다!)

그리고 Google 로그인이나 Github 로그인 한 경우에만,
등록하고 있는 이름이나 주소를 패스워드 없이 변경할 수 있도록 하고 싶어지기 쉽다.
유저에게 「패스워드란 무엇인가?」라고 되기 때문에.
(물론 구구는 코피페하면서! Devise + OmniAuth로 Qiita 스타일의 다중 공급자 인증 아래쪽을 참고로 했습니다!)

기본 코피페나로!

문제 발생



그렇습니다.
Google 로그인이나 Github 로그인한 경우에만 Forgot your password?의 기능도 지우고 싶어지기 쉽습니다.
유저에게 「패스워드란 무엇인가?」라고 되기 때문에.

나는 Copipe를 망쳤기 때문에 Devise를 사용자 정의하는 방법을 모른다.

그 때의 해결 방법을 이하에 써 보았다.

Devise의 정체



다양한 구그가 있다면 Devise는
htps : // 기주 b. 이 m / p ぁ ta ぉ r ㄴ ㄱ
에 근거해 움직이고 있는 것 같다.

그래, 확실히 omniauth_callbacks_controller.rb 라든지 registrations_controller.rb 을 오버라이드(override) 하는 느낌으로 Google 로그인을 만들고 있던 느낌은 있다!

해결까지의 정책



거기서 나는 해결까지의 방침을 세웠다.
  • 비밀번호 변경은 Devise 코드의 어느 부분에 해당하는지 확인합니다.
  • 파일 덮어쓰기

  • 짧지.

    비밀번호 변경은 Devise 코드의 어느 부분에 해당하는지 확인합니다.



    우선 패스워드 재발행시의 화면을 chrome 개발자로 살펴본다.



    과연, /users/password 에 POST로 데이터를 보내고 있는 것 같다.
    다음은 라우팅을 살펴본다.
    $ rails routes
    (省略)
           new_user_password GET      /users/password/new(.:format)         users/passwords#new
                edit_user_password GET      /users/password/edit(.:format)        users/passwords#edit
                     user_password PATCH    /users/password(.:format)             users/passwords#update
                                   PUT      /users/password(.:format)             users/passwords#update
                                   POST     /users/password(.:format)             users/passwords#create
    (省略)
    

    과연, 즉, users/passwords 의 create 메소드가 패스워드 재발행을 잡아야 한다.

    즉 패스워드 재발행의 소스는 htps : // 기주 b. 코 m / p ぁ ふぉ r ㄴ ㄴぇr. rb 의 create 메소드라고 목표를 붙인다.

    구체적으로는 다음과 같다.

    github.com/plataformatec/devise/blob/master/app/controllers/devise/passwords_controller.rb
    # 省略
      def create
        self.resource = resource_class.send_reset_password_instructions(resource_params)
        yield resource if block_given?
    
        if successfully_sent?(resource)
          respond_with({}, location: after_sending_reset_password_instructions_path_for(resource_name))
        else
          respond_with(resource)
        end
      end
    # 省略
    

    해당 파일 덮어쓰기



    이렇게, 다음은 이 파일을 덮어써야 한다.
    Google 로그인 구현시는 omniauth_callbacks 컨트롤러를 덮어썼다(같다).
    그 절차는 먼저 라우팅.

    config/routes.rb
    Rails.application.routes.draw do
      devise_for :users, controllers: {
        # 省略
        omniauth_callbacks: "users/omniauth_callbacks"
      }
    end
    

    그리고, app/controllers/users/omniauth_callbacks_controller.rb 를 신규 작성해, Devise 의 OmniauthCallbacksController 를 상속.

    app/controllers/users/omniauth_callbacks_controller.rb
    class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
      def google
        # 省略
      end
      # 省略
    end
    

    이 방법을 흉내내 보자.
    이번은 passwords 컨트롤러를 덮어쓰고 싶다.

    우선 라우팅.

    config/routes.rb
    Rails.application.routes.draw do
      devise_for :users, controllers: {
        # 省略
        omniauth_callbacks: "users/omniauth_callbacks",
        passwords: "users/passwords"
      }
    end
    

    다음은 app/controllers/users/passwords_controller.rb 를 신규 작성.
    Devise의 PasswordsController를 상속받습니다.
    그래서 놀리는 것은 create 방법!

    app/controllers/users/passwords_controller.rb
    class Users::PasswordsController < Devise::PasswordsController
      def create
      end
    end
    

    그런 다음 사용자가 지정한 이메일 주소 provider 존재하면 리디렉션 오류 메시지.
    그 이외는, 계승 그대로.
    즉,

    app/controllers/users/passwords_controller.rb
    class Users::PasswordsController < Devise::PasswordsController
      def create
        if User.find_by(email: params["user"]["email"]).provider.present?
          redirect_to new_user_password_path, notice: 'GoogleアカウントもしくはGithubアカウントで登録している場合はパスワードは使用されていません'
        else
          super
        end
      end
    end
    

    검증



    갔다! 말하자!



    즉 Devise의 기능의 커스터마이즈는


  • 어떤 컨트롤러의 어느 메소드인지 판단
  • 그 컨트롤러를 상속한 새로운 컨트롤러 작성
  • 메서드 덮어쓰기
  • 라우팅 재작성

  • 갈 수 있다!
    자, 아메 토크! 보고 자자.

    좋은 웹페이지 즐겨찾기