Edited at

Twitter OAuth でログイン のメモ

More than 3 years have passed since last update.


既に Twitterアプリケーションを作成済み。

Rails -v 4.2.6

使用する gem



  • omniauth-twitter -v1.2.1


  • omniauth -v1.3.1


  • dotenv-rails -v2.1.0


Herokuにデプロイしたらconfig/secrets.ymlが無いって怒られるから

dotenv-railsで環境変数を使うようにしてsecrets.ymlをバージョン管理下に入れた。



1 /.env ファイル作成

dotenv-railsが環境変数を.envファイルから取得する。


/.env

    TWITTER_CONSUMER_KEY    =  “Twitter************API_Key”


TWITTER_CONSUMER_SECRET = “Twitter**********secret_Key”



必ずバージョン管理から外す。(gitならgitignoreに追加する)


2 config/secrets.ymlを環境変数に対応させる。


config/secrets.yml


default_twitter: &default_twitter
twitter_api_key: <%= ENV["TWITTER_CONSUMER_KEY"] %>
twitter_api_secret: <%= ENV["TWITTER_CONSUMER_SECRET"] %>



default_twitter: &default_twitter

twitter_api_key: <%= ENV["TWITTER_CONSUMER_KEY"] %>

twitter_api_secret: <%= ENV["TWITTER_CONSUMER_SECRET"] %>



development:
 secret_key_base: 文字列
 ****************
<<: *default_twitter


 test:
 secret_key_base: 文字列
 ****************
<<: *default_twitter



production:
 secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

 <<: *default_twitter


3 config/initializers/omniauth.rbを作成

twitter用のproviderを設定する。


config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do

provider :twitter, Rails.application.secrets.twitter_api_key,
Rails.application.secrets.twitter_api_secret
end


4 Twitter OAuth(Omniauth)のモデル

  User:

provider: string -OmniAuthの認証で使用するプロバイダー名(例: ‘twitter’)
uid: string -Provider毎に与えられる識別用の文字列
nickname: string -Twitter ID
image_url: string -Twitterアイコン画像のURL

add_index :users,[:provider,:uid],unique:true

今回は全てNull:false

(ユニークインデックス) providerとuidの組み合わせは同じものはあってはならない。


5 /auth/twitterに飛ばす。


Twitter OAuth ログイン後処理

ログイン後 値を /auth/twitter/callback へ飛ばす。


1 ログイン後に対応するコントローラーを作成。

rails g controller sessions


2 createアクションとログイン機能を作成


user.rb

class << self

def find_or_create_from_auth_hash(auth_hash)
provider = auth_hash[:provider]
uid = auth_hash[:uid]
nickname = auth_hash[:info][:nickname]
image_url = auth_hash[:info][:image]

find_or_create_by(provider: provider,uid: uid) do |user|
user.nickname = nickname
user.image_url = image_url
end
end



/sessions_controller.rb


def create
user = User.find_or_create_from_auth_hash(request.env[omniauth.auth])
session[:user_id] = user.id
flash[success] = ‘ログインしました。’
redirect_to root_path
end


/sessions_helper.rb


def log_in(user)
session[:user_id] = user.id
end

def logged_in?
!session[:user_id].nil?
end



/application_controller.rb

include SessionHelper



3 ルーティングを作成


config/routes.rb

get /auth/:provider/callback => sessions#create’

get /delete=> sessions#destroy’,as: :logout


4 ログアウト処理を作成


/sessions_controller.rb

def destroy

reset_session
flash[:info] = ‘ログアウトしました。’
redirect_to root_path
end


5 header 変更

unless logged_in?

link_to 'ログイン','/auth/twitter'
else
link_to 'ログアウト',logout_path
end