【问题标题】:Omniauth: Mapping usersOmniauth:映射用户
【发布时间】:2012-02-21 02:30:55
【问题描述】:
我有一个关于使用 Omniauth 构建用户系统的一般性问题:当我启用多个身份验证方法时,我想确保用户无法通过其他提供商再次注册 - 无论是意外还是故意.我的尝试是检查电子邮件地址,这对大多数提供商都有效。
但是当我通过 Twitter 添加身份验证时,这个系统会因为Twitter won't publish the email of the user 而失败。
所以我能想到的唯一方法是在通过 Twitter(或任何其他不发布电子邮件的登录提供商)登录时添加第二步注册,我只是想知道是否有更方便的方法如何做到这一点?
感谢任何帮助或建议!
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
twitter
login
omniauth
【解决方案1】:
LinkedIn 也会遇到同样的问题。此外,我个人对我加入的每个站点都使用不同的电子邮件。因此,即使您请求我的电子邮件也无法帮助您识别我。如果您只使用 Omniauth 而不是 Devise,您可以在用户每次登录时检查他们是否也登录了其他服务并合并帐户。不过这似乎没有必要,因为人们通常会一直登录他们的 twitter/fb 帐户。只要您在提供注册页面之前检查两者,您就应该是黄金。如果您真的想阻止人们拥有多个帐户,您要么需要并验证手机号码,要么严格依赖一个提供服务的提供商。
【解决方案2】:
您真正关心的是用户是否已通过身份验证,一旦他/她拥有,您只需要跟踪谁通过身份验证的用户 ID 以及他们用于身份验证的服务。因此,如果一个人在 twitter 下登录并尝试在 Facebook 下登录,您的代码需要知道与该 twitter 用户关联的 user_id(如果您遵循 Ryan Bate 的 railscast,则不是 UID),并且该 facebook 用户需要具有相同的 user_id。您仍然可以让他使用第二个服务进行身份验证,但最后一步是检查在哪个服务 user_id 下登录(与他们刚刚登录的那个相反。如果服务不同,则意味着他们试图在第二个服务下潜入。你可以应付。