使用 omniauth 进行 Facebook 身份验证

Facebook authentification with omniauth

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

首先,我有一个错误ActiveModel::ForbiddenAttributesError。我用 .

更正了它

现在,当我使用 Facebook 登录时,它可以正常工作,但是当我使用另一个帐户登录时,它会覆盖我 table 中以前的用户,所以我不能有超过一个 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 显示在控制台中,但它编辑而不是在 table

中创建新行

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

...但这太容易让人难以置信。

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

auth.info.email

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