Facebook对omniauth进行身份验证

时间:2016-10-27 15:04:23

标签: ruby-on-rails ruby-on-rails-5 facebook-authentication

我遇到了tutorial编写Facebook身份验证系统的问题。

首先,我遇到错误ActiveModel :: ForbiddenAttributesError。我用coderhs answer更正了它。

现在,当我使用Facebook登录时,它可以正常运行,但是当我使用其他帐户登录时,它会覆盖我桌面中的上一个用户,因此我无法同时连接多个Facebook用户,仍然保留用户的相关信息。

User.rb

def self.from_omniauth(auth)
    where(auth.slice(provider: auth.provider, uid: auth.uid)).first_or_create.tap do |user|
        user.provider ||= auth.provider
        user.uid = auth.uid
        user.name = auth.info.name
        user.oauth_token = auth.credentials.token
        user.oauth_expires_at = Time.at(auth.credentials.expires_at)
        user.save!
    end

修改 我注意到first_or_create编辑了最后插入的查询并且没有创建条目,我添加了它:

User.rb

def self.from_omniauth(auth)
        where(auth.slice(uid: auth.uid)).first_or_create.tap do |user|
            if user.uid == auth.uid
                puts "\nUserModel:_________" + auth.provider + " - " + auth.uid + "\n"
            else
                puts "\nUnknown user        " + auth.uid
            end
            user.provider = auth.provider
            user.uid = auth.uid
            user.name = auth.info.name
            user.email = auth.info.email
            user.oauth_token = auth.credentials.token
            user.oauth_expires_at = Time.at(auth.credentials.expires_at)
            user.save
        end
    end

当我使用第二个帐户登录时,else puts会显示在控制台中,但会进行编辑而不会在表格中创建新行

Edit2 [解决方案]

User.rb

def self.from_omniauth(auth)
        User.find_or_create_by(uid: auth.uid).tap do |user|
            if user.uid == auth.uid
                puts "\nUserModel:_________" + auth.provider + " - " + auth.uid + "\n"
            else
                puts "\nUnknown user        " + auth.uid
            end
            user.provider = auth.provider
            user.uid = auth.uid
            user.name = auth.info.name
            user.email = auth.info.email
            user.oauth_token = auth.credentials.token
            user.oauth_expires_at = Time.at(auth.credentials.expires_at)
            user.save
        end
    end

[第二个问题由Oleksandr Avoyants解决]我也想知道如何从Facebook用户那里获取电子邮件。我试着添加

user.email = auth.email

......但实在太容易了。

1 个答案:

答案 0 :(得分:0)

根据omniauth-facebook README,您可以通过以下方式获取用户的电子邮件:

auth.info.email

注意:可用的确切信息可能取决于您请求的权限。