使用 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
注意:可用的准确信息可能取决于您请求的权限。
我在 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
注意:可用的准确信息可能取决于您请求的权限。