2011-01-10 76 views
27

我有几个Rails应用程序,我期待与OmniAuth集成,但是存在一个概念性问题,我希望先弄清楚它。考虑以下情形:OmniAuth:针对同一用户的多个帐户进行防护

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

由于Twitter不会为Foo提供电子邮件地址,因此没有用于检测两个Joes是否相同的Joe的通用标识符。您可以决定仅支持向您提供用户电子邮件地址的提供商,但如果用户在不同的提供商处注册了不同的电子邮件地址,则这不起作用。

我能想到的唯一的其他解决方案是给用户合并两个现有帐户的方式。与使用OmniAuth时相对容易的一切相比,这是一个非常头疼的问题。如果这是唯一的解决方案,是否有人会遇到一个指导/教程,展示如何做到这一点?我很惊讶这个问题没有得到更多的关注,因为OmniAuth的流行。

谢谢!

+1

我没有看到一个完美的解决了这个问题。所以,我决定现在与单一供应商一起,直到我找到一个坚实的解决方案。 – hnprashanth 2011-03-28 07:30:02

+1

你好Jimmy Cuadra,你可以看看try.discourse.org。话语已经使用omniauth实现了多种注册选项。它的源代码在GitHub上可用。 – 2013-05-04 21:18:46

回答

7

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

+4

这是如何被接受的答案?任何人都发现一个体面的合并工具呢? – 2012-07-12 17:30:28

+2

因为这是唯一可能的答案?您无法阻止用户因事故而获得两个帐户。没有一个合并工具可以知道你的应用程序要做什么。 唯一的最佳实践,以用来帮助缓解* *合并过程是将身份验证身份从您的应用程序的实际用户配置文件分开。这样,您的应用可以允许多个身份验证提供程序链接到单个用户配置文件。 – mlibby 2013-02-11 20:10:37

2

我注意到堆栈溢出似乎尝试并通过将用户的身份验证首选项存储在cookie中来克服此问题,并在您返回到登录页面时自动登录到您。

虽然它仍不能提供完整的解决方案,但可能有助于减少后果。

+0

但是,如果用户清除自己的饼干... – SZH 2011-04-24 14:51:28

3

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

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

然而,让用户的电子邮件地址和密码,我也可以处理各类可能发生的情况下(包括你所描述的一个):删除

  • 原始的认证供应已关闭或用户他们的身份验证提供者帐户 - >解决方案:用户可以使用他们的电子邮件和密码以传统方式登录。 (请注意,这是我还没有看到任何地方提到的净又一个重要的情况下,人们似乎认为FB,微博等均会永远存在,永远不会来,用户将不会与那些放弃自己的账户服务。通过不存储用户PW和电子邮件你将失去这是由供应商产生,如果这些情况ocurrs之一,因为你不能把它们映射到用户不再您所有的用户帐户。对我来说,是上不可接受的依赖外部服务。)

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

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

6

我知道这是一个老问题,但认为我会与我最近的一个项目完成反正答案,仅供参考。

全面披露:我没有想出这个,我偷了它从别人的网站上的其他人。有一个很好的写了on the Omniauth wiki

我从来没有发现一个很好的方式,自动将Facebook的链接/微博/等账户,而是说得那么一旦他们与第一个登录的用户可以将多个账户。

这是情形:

  • 用户用例如登录Facebook的
  • 他们有一个个人资料页,其中列出他们已经连接到该帐户的社交网络,以及每种类型链接到帐户的选项
    • 如“脸谱链接|友情链接的Twitter |友情链接谷歌”
  • “链接的Twitter”,例如链接到同一omniauth操作的用户将使用登录Twitter的
  • 在回调处理程序,检查用户是否在
    • 记录如果是这样,存储提供商并单独记录用户
    • 否则,记录他们在像往常一样

而不是存储在用户模型提供者和UID的,该模型将被一个用户可以有很多的社交网络身份。

再次,对不起,使死人复活,但在回答接受的答案安倍Petrillo的评论让我想起另一种观点认为可能是有用的。

相关问题