deviseを利用して、twitterのouth認証を実装したのですが、なぜか、正しく認証→新規登録出来ないケースが発生します。
関連する、user.rbとomniouth_callback_controller.rbは以下の通りです。
omniauth_callbacks_controller.rb
ruby
1 def twitter 2 callback_from :twitter 3 end 4 5 def failure 6 flash[:alert] = "Twitterの認証に失敗しました" 7 redirect_to sessions_select_path 8 end 9 10 private 11 def callback_from(provider) 12 provider = provider.to_s 13 @user = User.find_for_oauth(request.env['omniauth.auth'].except("extra")) 14 if @user.persisted? 15 16 sign_in(:user, @user) 17 current_user.remember_me! 18 19 #ensure remember_user_token is set 20 cookies.signed["remember_user_token"] = { 21 :value => @user.class.serialize_into_cookie(@user.reload), 22 :expires => 3.months.from_now, 23 :domain => "0.0.0.0",} 24 redirect_to root_path 25 26 else 27 if provider == 'twitter' 28 session["devise.twitter_data"] = request.env["omniauth.auth"].except("extra") 29 flash[:alert] = "Twitter認証後にエラーが発生しました。もう一度お試しください。" 30 redirect_to sessions_select_path 31 end 32 end 33 end
▼user.rb
ruby
1 def self.find_for_oauth(auth) 2 user = User.without_soft_destroyed.where(uid: auth.uid, provider: auth.provider).first 3 4 unless user 5 user = User.create( 6 uid: auth.uid, 7 provider: auth.provider, 8 username: auth.info.name, 9 email: User.get_email(auth), 10 password: Devise.friendly_token[6, 30] 11 ) 12 end 13 14 p user 15 user 16 end 17 18 private 19 20 def self.get_email(auth) 21 email = auth.info.email 22 email = "#{Time.current.to_i.to_s}-#{auth.provider}-#{auth.uid}@example.com" if email.blank? 23 email 24 end
ログを見て調査したところ、user.rbのself.find_for_oauthの中で、User.createが正しく動いていないようでした。以下がそのCreateしたuserのuser変数に入っている値をpしたものです。
▼正常に新規登録出来た場合のログ(uidやusernameなど伏字)
#<User id: 3, active: true, email: "1481861405-twitter-***********@example.com", icon: "", created_at: "2016-12-16 04:10:05", updated_at: "2016-12-16 04:10:05", provider: "twitter", uid: "***********", username: "*********">
▼新規登録出来なかった場合のログ
#<User id: nil, active: true, email: "1481871154-twitter-***********@example.com", icon: "", created_at: nil, updated_at: nil, provider: "twitter", uid: "***********", username: "***********">
自動的にinsertされるはずの、idとcreated_at、updated_atがnilになっています。
同じコードなのですが、なぜかUserのcreateがうまくいかない時があるようです。
これはなぜなのでしょうか??
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。