OmniAuth:防范同一用户的多个帐户

时间:2011-01-10 06:58:51

标签: ruby-on-rails omniauth

我有几个Rails应用程序,我正在寻求与OmniAuth集成,但我有一个概念性的问题,我想先找出来。请考虑以下情形:

  1. 您的应用程序Foo通过Twitter和Facebook支持OmniAuth登录。
  2. Joe来到您的网站并通过他的Twitter帐户登录。这将在Foo上创建一个新用户,并将其与此新的Twitter授权相关联。
  3. Joe退出Foo,忘记了该网站六个月。
  4. 乔回到Foo,不记得他之前已经登录过Twitter。
  5. Joe使用Facebook登录。由于他尚未通过原始Twitter授权登录,因此无法检测到他实际上是同一个Joe,并且创建了一个新帐户。
  6. Joe发现了他的旧帐户,现在很沮丧,他的旧内容与这个旧帐户绑定,并且他不能互换地使用Twitter和Facebook登录。
  7. 由于Twitter不向Foo提供电子邮件地址,因此没有通用标识符可用于检测两个Joes是同一个Joe。您可以决定仅支持向您提供用户电子邮件地址的提供商,但如果用户在不同提供商处注册了不同的电子邮件地址,则无效。

    我能想到的唯一其他解决方案是为用户提供一些合并两个现有帐户的方法。与使用OmniAuth时其他一切相对容易相比,这是一个令人头疼的问题。如果这是唯一的解决方案,是否有人遇到指导/教程,展示如何做到这一点的示例?考虑到OmniAuth的普及,我对这个问题没有得到更多关注感到惊讶。

    谢谢!

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:6)

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

完全披露:我没有想出这个,我从网上的其他人那里偷了它。写得很好on the Omniauth wiki

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

这是情景:

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

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

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

答案 2 :(得分:3)

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

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

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

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

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

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

答案 3 :(得分:2)

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

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