2015-08-18 20 views
0

我嘗試使用devise進行Facebook身份驗證。但如果我點擊Facebook身份驗證按鈕,我被重定向到通常的登錄表單。下面是 是user.rb的代碼。當我使用Facebook的身份驗證與設計,我無法獲得用戶的電子郵件地址

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable 
    has_and_belongs_to_many :roles 
    mount_uploader :image, ImageUploader 

    def has_role?(name) 
    self.roles.where(name: name).length > 0 
    end 

def self.find_for_oauth(auth) 
    user = User.where(uid: auth.uid, provider: auth.provider).first 
    unless user 
     user = User.create( 
     uid: auth.uid, 
     provider: auth.provider, 
     name: auth.info.name, 
     email: auth.info.email, 
     password: Devise.friendly_token[4, 30]) 
    end 
    end 
end 

但是當我把虛假的電子郵件地址,我可以登錄Facebook的認證。

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable 
    has_and_belongs_to_many :roles 
    mount_uploader :image, ImageUploader 

    def has_role?(name) 
    self.roles.where(name: name).length > 0 
    end 

    def self.find_for_oauth(auth) 
    user = User.where(uid: auth.uid, provider: auth.provider).first 
    unless user 
     user = User.create( 
     uid: auth.uid, 
     provider: auth.provider, 
     name: auth.info.name, 
     email: User.dummy_email(auth), 
     password: Devise.friendly_token[4, 30]) 
    end 
    user 
    end 

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

什麼問題?

+0

如果您嘗試在self.find_for_oauth中插入這行代碼,會顯示'puts auth.info.email'是什麼?你也可以嘗試User.create!()而不是User.create()?只是想,也許它失敗了一些驗證或什麼。 –

回答

0

這是驗證問題,因爲如果用戶不想公開分享電子郵件,Facebook不提供電子郵件地址。

所以你需要添加一個空白電子郵件的檢查。如果電子郵件是空白的,那麼你可以用他的名字+姓氏+一些ramdom uniq編號創建一封電子郵件。

然後你要求用戶輸入他的有效電子郵件。

相關問題