Ominauthでtwitter/facebook認証
あけましておめでとうございます。
TwitterとFacebookのどちらでも認証できて、なおかつログイン後にもう一方のアカウントを紐付けできるようにしてみた。
まずOmniauthの設定。1.0になって色々変わってるので、こちらの記事を参考に。 まぁproviderごとのgemを追加して、user_infoをinfoにするだけなんだけどね。
次にモデル。UserとAuthenticationを用意した。
rails g model User nickname:string
rails g model Authentication user_id:integer uid:string provider:string screen_name:string access_token:string access_secret:string
class User < ActiveRecord::Base
has_many :authentications
class << self
def create_with_omniauth(auth)
user = User.create! do |user|
user.nickname = auth["info"]["nickname"]
end
user.authentications.create! do |authentication|
authentication.set_attributes auth
end
user
end
end
def add_provider(auth)
self.authentications.create! do |authentication|
authentication.set_attributes auth
end
end
end
class Authentication < ActiveRecord::Base
belongs_to :user
def set_attributes(auth)
self.provider = auth["provider"]
self.uid = auth["uid"]
self.screen_name = auth["info"]["nickname"]
set_credentials auth
end
def set_credentials(auth)
self.access_token = auth["credentials"]["token"]
self.access_secret = auth["credentials"]["secret"]
self
end
end
これでcontrollerからUser.create_with_omniauth request.env[“omniauth.auth”]とかやればユーザが作成される。 紐付けするには、@user.add_provider request.env[“omniauth.auth”]でOK。 ログイン部分とかは省略するので他の情報源当たって下さい。 あと、プロフィール画像とかURLとかのソーシャルグラフを毎回引っ張ってくるとレスポンスが遅いので、モデルの属性としてキャッシングしておくことをお勧めします。