27

我有几个希望与 OmniAuth 集成的 Rails 应用程序,但是我遇到了一个概念问题,我想先弄清楚。考虑以下场景:

  1. 您的应用程序 Foo 支持通过 Twitter 和 Facebook 进行 OmniAuth 登录。
  2. 乔来到您的网站并通过他的 Twitter 帐户登录。这会在 Foo 上创建一个新用户并将其与这个新的 Twitter 授权相关联。
  3. Joe 从 Foo 注销,并在六个月内忘记了该站点。
  4. Joe 回到 Foo,不记得他之前曾使用 Twitter 登录过。
  5. 乔使用 Facebook 登录。由于他尚未通过其原始 Twitter 授权登录,因此无法检测到他实际上是同一个 Joe,因此创建了一个新帐户。
  6. Joe 发现了他的旧帐户,现在他很沮丧,因为他的旧内容与这个旧帐户相关联,而且他无法交替使用 Twitter 和 Facebook 登录。

由于 Twitter 不向 Foo 提供电子邮件地址,因此没有通用标识符可用于检测这两个 Joe 是同一个 Joe。您可以决定仅支持向您提供用户电子邮件地址的提供商,但如果用户在不同提供商的不同电子邮件地址上注册,这将无济于事。

我能想到的唯一其他解决方案是为用户提供一些合并两个现有帐户的方法。与使用 OmniAuth 时其他一切相对容易相比,这是一个令人头疼的问题。如果这是唯一的解决方案,是否有人遇到过指南/教程,显示了如何完成此操作的示例?鉴于 OmniAuth 的流行,我很惊讶这个问题没有得到更多的关注。

谢谢!

4

4 回答 4

7

你的直觉是正确的。您必须为您的用户提供一个合并工具......或者您可以忽略这个问题。

于 2011-01-10T07:02:59.277 回答
6

我知道这是一个老问题,但我想我会回答我最近在一个项目上所做的事情,仅供参考。

完全披露:这不是我想出来的,我是从网上的其他人那里偷来的。Omniauth wiki 上有一篇很好的文章。

我从来没有找到一种自动链接 Facebook/Twitter/etc 帐户的好方法,而是这样做了,以便用户在使用第一个帐户登录后可以链接多个帐户。

这是场景:

  • 用户使用例如 Facebook 登录
  • 他们有一个个人资料页面,其中列出了他们附加到帐户的社交网络,以及将每种类型链接到帐户的选项
    • 例如“Facebook 链接 | 链接 Twitter | 链接 Google”
  • “链接 Twitter”例如链接到用户用于登录 Twitter 的同一个omniauth 操作
  • 在回调处理程序中,检查用户是否已登录
    • 如果是,则将提供程序和 uid 存储在用户的单独记录中
    • 否则,照常登录

代替将提供者和 uid 存储在用户模型上,该模型将是用户可以拥有许多社交网络身份。

再次抱歉,让死者复活,但 Abe Petrillo 对已接受答案的回复让我认为另一种观点可能有用。

于 2013-01-05T07:46:58.113 回答
3

我今天也遇到了这个问题。我想我会通过以下方式处理它:

我会在注册时询问用户他们的电子邮件和密码,就像在传统的身份验证设置中一样,我尝试从用户选择的 OmniAuth 服务(FB、Twitter 等)获取电子邮件。因此,如果身份验证提供商未提供电子邮件,他们只需提供电子邮件。然后,如果用户稍后使用他们用于注册的同一提供商登录,他们将立即登录。这可能会在 99% 的情况下发生。

但是,有了用户的电子邮件和密码,我还可以处理可能发生的各种情况(包括您描述的情况):

  • 原来的身份验证提供者已关闭或用户删除了他们的身份验证提供者帐户 -> 解决方案:用户可以使用他们的电子邮件和密码以传统方式登录。(注意,这是一个重要的案例,我还没有在网上看到任何地方提到过。人们似乎认为 FB、Twitter 等将永远存在,永远不会关闭,用户也永远不会退出他们的帐户服务。通过不存储用户密码和电子邮件,如果发生这些情况之一,您将丢失由提供商生成的所有用户帐户,因为您无法再将它们映射到用户。对我来说,这是不可接受的依赖外部服务。)

  • 用户稍后使用不同的身份验证提供商登录(这是您的情况)-> 解决方案:尝试使用他们的电子邮件将用户映射到现有帐户,如果失败,请显示带有按钮/链接的注册表单“我已经一个帐户,请让我登录”(或类似的;-)。如果他们点击它,他们必须提供他们的电子邮件和密码。然后,如果他们成功验证,您可以简单地将该提供者添加到现有用户记录中,下次他们立即登录,就像他们最初用于注册的提供者一样......

也许还有其他可能发生的情况。任何反馈?

于 2011-01-22T19:22:22.990 回答
2

我注意到 Stack Overflow 似乎在某种程度上试图克服这个问题,方法是将用户的身份验证首选项存储在 cookie 中,并在您返回登录页面时自动登录。

虽然它仍然没有为这个问题提供完整的解决方案,但它可能有助于最大限度地减少后果。

于 2011-01-10T07:20:53.127 回答