Devise의 기능을 사용자 정의하는 방법(예: SNS 계정으로 로그인한 경우 비밀번호 재발행을 방지)
배경
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 코드의 어느 부분에 해당하는지 확인합니다.
우선 패스워드 재발행시의 화면을 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의 기능의 커스터마이즈는
갈 수 있다!
자, 아메 토크! 보고 자자.
Reference
이 문제에 관하여(Devise의 기능을 사용자 정의하는 방법(예: SNS 계정으로 로그인한 경우 비밀번호 재발행을 방지)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kakiuchis/items/93f76025f49593d61a9a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)