rails6 + devise를 사용하여 Yahoo 인증 기능을 만드십시오!

rails6에서 Yahoo 인증 기능을 만듭니다.



Devise 및 Omniauth 설치



Gemfile에 설명합니다.
gem 'devise'
gem 'omniauth'
gem 'omniauth-yahoojp'



$ bundle install

이제 devise omniauth omniauth-yahoojp가 bundle install되었습니다!

Devise 설정 등


 $ rails g devise:install

 $ rails g devise user 

 $ rails g devise:views

 $ rails g devise:controllers users

이것들을 수행합니다.

그리고 app/models/user.rb에
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

그리고 있다고 생각합니다.
  :omniauthable, omniauth_providers: [:yahoojp]

이것을 추가하십시오.

덧붙여서 이것은 omniauthable를 이 모델에서 사용하는 느낌입니다.

다음 사용자 모델에
name provider uid를 추가하여 yahoo의 데이터를 저장하는 열을 추가합니다.
 $ rails g migration AddOminiauthToUsers 

그리고 실행하여 migration 파일을 만들 수 있기 때문에

가능한 migration 파일에
  def change
    add_column :users, :uid, :string
    add_column :users, :provider, :string
    add_column :users, :token, :text
  end

를 기술 해주세요.

그리고
 $ rails db:migrate

그렇다면 컬럼 추가되었을 것입니다!

Yahoo의 Key라든지 얻는다.



htps : ///에. 로 ゔぇぺぺr. 야호오. 이. jp/다 sh보아 rd/
이 URL을 방문하여
새로운 응용 프로그램 개발을 누르십시오.



⇃하면 이런 화면이 됩니다만



이 사이트 URL
localhost:3000
해주세요.
사이트명이나 어플리케이션의 설명은 자유롭게.
그리고 등록해 드리겠습니다.

등록한 후 다시 한 번 애플리케이션 관리로 돌아가서 콜백 URL을 설정합니다.



이렇게 localhost : 3000/users/auth/yahoojp/callback

로 줄 것입니다.

환경 변수 설정



Gemfile에
gem 'dotenv-rails'

추가
$ bundle install

그리고 .env 파일을 추가하십시오.

.env 파일에
YAHOOJP_KEY="YAHOOのClientIDを記述"
YAHOOJP_SECRET="YAHOOのシークレットキーを記述"

그리고 .gitinore 파일에
/.env

라고 씁니다. 이제 비밀 키와 ClientID를 환경 변수로 사용할 수 있습니다!

그건 그렇고, 비밀 키와 ClientID는 흔들리지 않으므로 조심하십시오.

Yahoo 인증 구현



routes.rb
 devise_for :users

그렇다고 생각합니다.
devise_for :users, controllers: {
    omniauth_callbacks: "users/omniauth_callbacks"
}

  get '/auth/:provider/callback' => 'users/omniauth_callbacks#yahoojp', as: "helloyahoo"  # ←これ居るかわからないけど一応。。

그리고 추가하십시오.

config/devise.rb에

  config.omniauth :yahoo_jp, ENV['YAHOOJP_KEY'], ENV['YAHOOJP_SECRET'] #必要なのかわからないけど一応..


config/initializers/omniauth.rb 파일 추가

omniauth.rb에
Rails.application.config.middleware.use OmniAuth::Builder do
        provider :yahoojp, ENV['YAHOOJP_KEY'], ENV['YAHOOJP_SECRET'], 
        {
                :scope => 'openid profile email address'
                # :provider_ignores_state => true  これを追加するのはおすすめしません。
        }
end


그리고 user.rb에
  def self.find_for_yahoo_jp(auth)
    user = User.where(email: auth.info.email, provider: auth.provider).first
    unless user
      user = User.create!(name: auth.info.name,
                          provider: auth.provider,
                          email: auth.info.email,
                          uid: auth.uid,
                          token: auth.credentials.token,
                          password: Devise.friendly_token[0, 20])
    end
    user
  end

추가.

그리고 app/controllers/users/omniauth_callbacks_controller.rb

  def failure
    @user = Sns.find_for_yahoo_jp(request.env['omniauth.auth'])
    if @user.persisted?
           flash[:notice] = I18n.t 'devise.omniauth_callbacks.success', 
                       :kind => "Yahoo"
      sign_in_and_redirect @user, :event => :authentication
    else
      session['devise.yahoo_data'] = request.env['omniauth.auth'].except("extra")
      redirect_to new_user_registration_url
    end
  end

추가.

app/views/devise/registrations/new.html.erb
<h2><%= link_to "Yahoo! JAPAN で登録",user_yahoojp_omniauth_authorize_path %>

이것으로 할 수 있다고 생각합니다.

참고





끝에



엔지니어가 댓글을 달 수있었습니다.

조언 코멘트를 읽어보십시오.

그래서 Rails에서 Yahoo 로그인 인증을 만드는 기사가 너무 적어 꽤 고전했습니다.

뭔가 실수 등이 있으면 코멘트하십시오.
감사합니다.

좋은 웹페이지 즐겨찾기