【Rails】omniauth-twitter로 Twitter 로그인을 구현하는 흐름

최근 Google 로그인 구현 을 하고 있고, 드디어 Twitter 로그인도 구현하려고 했는데, 망설였으므로 메모해 둡니다.

TwitterAPI 준비



Twitter Developers





Gemfile 편집



Gemfile
gem 'omniauth'
gem 'omniauth-twitter'
gem 'devise'
gem 'dotenv-rails' #後で使う
$ bundle install
$ rails g devise:install
$ rails g devise user
$ rake db:migrate

devise.rb 편집



.env
TWITTER_ID='ペースト'
TWITTER_APP_SECRET='ペースト'

.gitignore
/.env

config/initializers/devise.rb
config.omniauth :twitter, ENV['TWITTER_ID'], ENV['TWITTER_APP_SECRET']


user.rb 편집



user.rb
#以下を追記
protected
  def self.find_for_oauth(auth)
    user = User.where(uid: auth.uid, provider: auth.provider).first

    unless user
      user = User.create(name: auth.info.name,
                         email: User.dumy_email(auth),
                         provider: auth.provider,
                         uid: auth.uid,
                         password: Devise.friendly_token[0, 20]
                         )
    end
    user
  end

  private

  def self.dumy_email(auth)
    "#{auth.uid}-#{auth.provider}@example.com" #POINT
  end

위와 같이 작성된 User에 대해서는 self.dumy_email 에 의해 더미의 메일 주소를 생성하도록(듯이) 하고 있습니다. 여기에서는 auth.idauth.provider 의 조합이 일의인 것을 이용하고 있습니다.

Google/Facebook 로그인의 구현에서는, email: auth.info.email 로 메일 주소를 취득할 수 있었습니다만, TwitterAPI에서는 nil 가 바뀌어 버리기 때문에, 위와 같은 구현이 필요.

routes.rb 편집



routes.rb
devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }

omniauth_callbacks_controller.rb 구현



app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def twitter
    callback_from :twitter
  end

  def callback_from(provider)
    provider = provider.to_s
    @user = User.find_for_oauth(request.env['omniauth.auth'])

    if @user.persisted?
      flash[:notice] = I18n.t 'devise.omniauth_callbacks.success', kind: provider.capitalize
      sign_in_and_redirect @user, event: :authentication
      session[:user_id] = @user.id #add
    else
      session['devise.#{provider}_data'] = request.env['omniauth.auth']
      redirect_to new_user_registration_url
    end
  end
end


로그인 링크 구현



login_form.html.erb
<%= link_to 'Twitterログイン', user_twitter_omniauth_authorize_path  %>

Heroku 배포에서 오류가 발생하는 경우



아래의 기사의 후반에서, Precompiling assets failed
【Rails】Google 로그인 구현~Heroku 배포까지의 길

heroku run rails db:migrate 전에 할 일!



이번에는 TwitterAPI 정보를 .gitignore로 지정하고 있으므로 Heroku 측에서 설정해야합니다.
$ heroku config:set TWITTER_ID='ペースト'
$ heroku config:set TWITTER_APP_SECRET='ペースト'
$ heroku run rails db:migrate

참고 링크



Devise+OmniAuth에서 사용자 인증을 구현하는 단계

좋은 웹페이지 즐겨찾기