Omniauthと言うgemを使いfacebook認証とtwitter認証を作りました。facebook認証時にメールアドレスが取れないのですが、どうしたらよいでしょうか?
modelのemail: User.dummy_email(auth)と言うところでfacebook認証時にもダミーアドレスを入れているので取れないということはわかるのですが、どうしたらよいかわかりません
self.dummy_email(auth)を色々いじってみましたが、うまくいきませんでした。。
ruby
1class User < ActiveRecord::Base 2 # Include default devise modules. Others available are: 3 # :lockable, :timeoutable and :omniauthable 4 devise :database_authenticatable, :registerable, :confirmable, 5 :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :async 6 7 # いらないかもユーザネームでログンするときだけいる 8 #, :authentication_keys => [:login] 9 10 attr_accessor :login 11 12 13 14 def update_without_current_password(params, *options) 15 params.delete(:current_password) 16 17 if params[:password].blank? && params[:password_confirmation].blank? 18 params.delete(:password) 19 params.delete(:password_confirmation) 20 end 21 22 result = update_attributes(user_params(params), *options) 23 clean_up_passwords 24 result 25 end 26 27 28 # cancancan で使用する権限管理用のロール 29 def has_role? role_name 30 roles.exists?(name: role_name) 31 end 32 33 34 35 36 37 def self.find_for_oauth(auth) 38 user = User.where(uid: auth.uid, provider: auth.provider).first 39 unless user 40 user = User.create( 41 uid: auth.uid, 42 name: auth.info.name, 43 user_name: User.dummy_user_name(auth), 44 provider: auth.provider, 45 email: User.dummy_email(auth), 46 password: Devise.friendly_token[8, 128], 47 confirmed_at: Time.now 48 ) 49 end 50 user 51 end 52 53 54 55 56 private 57 58 def self.dummy_email(auth) 59 if auth.info.email.blank? 60 "#{auth.uid}-#{auth.provider}@example.com" 61 else 62 auth.info.email 63 end 64 end 65 66 def self.dummy_user_name(auth) 67 if auth.info.user_name.blank? 68 "#{Random.rand(1..9999)}#{auth.provider}#{auth.uid}" 69 else 70 auth.info.nickname 71 end 72 end 73 74 validates :user_name, 75 :uniqueness => { 76 :case_sensitive => false 77 }, 78 :format => { with: /\A[a-z0-9]+\z/i }, 79 :length => { maximum: 40 } 80 81 82 def self.current_user 83 Thread.current[:current_user] 84 end 85 86 87 def self.current_user=(user) 88 Thread.current[:current_user] = user 89 end 90 91 92 93 # ユーザーからの入力は信用しない:許可されたパラメータだけ変更できるようにする 94 def user_params params 95 params.permit(:user_name, :email, :password, :password_confirmation) 96 end 97end 98
ruby
1class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 2 3 def facebook 4 callback_from :facebook 5 end 6 7 def twitter 8 callback_from :twitter 9 end 10 11 private 12 13 def callback_from(provider) 14 provider = provider.to_s 15 @user = User.find_for_oauth(request.env['omniauth.auth']) 16 if @user.persisted? 17 flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: provider.capitalize) 18 sign_in_and_redirect @user, event: :authentication 19 else 20 if provider == 'twitter' 21 session["devise.twitter_data"] = request.env["omniauth.auth"].except("extra") 22 else 23 session["devise.facebook_data"] = request.env["omniauth.auth"] 24 end 25 redirect_to new_user_registration_url 26 end 27 end 28 29 30 31
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。