首页 文章

可以设计Omniauth有几种类型的登录?

提问于
浏览
6

我已经将Devise用作其他项目的标准认证gem . 在另一个项目中,我使用Devise Omniauth进行Twitter身份验证 .

在一个新项目中,我需要我的最终用户能够通过Twitter和Facebook登录,或者能够通过应用程序注册 . 将来用户可以将他的帐户链接在一起 . 例如,他的Twitter和Facebook帐户 . 或者,他的Twitter和“原生”帐户 . “原生”是他直接在网络应用中注册的帐户 .

Devise能够做到这一点吗?如果是这样,我们如何将用户的帐户链接在一起?这背后的概念是什么?该应用程序如何知道哪个Facebook和Twitter帐户属于哪个用户?

欢迎提出意见和建议 .

EDIT:

我一直在关注http://railscasts.com/episodes/236-omniauth-part-2?autoplay=true,我没有得到的是 . 如果

  • 用户已退出应用,

  • 用户在app中注册了一个帐户,

  • 用户使用其他服务提供商(facebook,twitter等)登录 .

该应用程序如何知道如何将其新服务提供商与其现有帐户相关联?

Stackoverflow.com具有此功能 . 但是,他们未在其“多重签名”功能中包含的一个服务提供商是Twitter . 我猜这是因为Twitter不会通过他们的API公开用户的电子邮件 . 而其他服务提供商(Facebook,雅虎,Gmail)的确如此 .

4 回答

  • 1

    电子邮件通常用于链接所有帐户,但是使用Twitter,您无法获得电子邮件帐户 . 使用电子邮件并不是一个好的做法,因为用户不一定使用相同的电子邮件地址注册每个服务 .

    询问用户是否想要在登录后使用facebook / twitter / google / openid进行身份验证是最简单的方法,并且对用户来说更容易预测 . 你必须阻止这个效果“这个网站如何知道我的Facebook帐户?他们为什么跟踪我?”

    作为旁注,最困难的部分不是添加新的身份验证方法,而是在用户(例如,用facebook创建一个帐户,用twitter创建一个帐户)时合并帐户 .

  • 0

    Devise完全有能力做到这一点,但由于每个提供商都有自己的令牌,因此无论用户选择哪个提供商登录,都需要一种方法来识别用户 .

    最常见的方法是使用电子邮件字段,您需要在每个提供商请求中询问电子邮件,我个人不喜欢它,因为用户仍然可以在不同的提供商中拥有不同的电子邮件 .

    要解决此问题,您可以选择“将我的Facebook登录与我的Twitter登录连接” .

  • 3

    请查看此截屏视频,它会对您有所帮助:OmniAuth

    OmniAuth part2

    最近我玩过你现在遇到的这样的问题 . 我的目标是实现许多身份验证解决方案:Google,Twitter,Facebook ..同时 - 用户可以使用多个提供商登录(例如在Stackoverflow.com中),并且在注销后他仍然使用其他服务登录 . 我已经通过创建下一个模式实现了这一点(我现在没有我的代码,但它应该给你一个线索):

    class User
     has_many :authentications
     has_many :known_authentications
    end
    
    class Authentication
      #implemented nearly as in Ryan's Railscasts (It keeps authorization info)
    end
    
    class KnownAuthentications
      #has :provider, :user_id, :uid and :email columns. Here I keep all authorizations for registered user, that he ever had(so I can verify user by email and guess that this is the same user as logged in from different services). I fill this table when user registers with any service(Google, Twitter etc.). 
    end
    

    当用户登录时,我通过电子邮件检查KnownAuthentifications表以获取当前授权服务(OpenID服务通过电子邮件发送其他参数,OAuth - 不要(所以我在这里创建假电子邮件,比如fake@email.com - >所以Devise不会通过电子邮件除外) )) . 现在知道从Google登录的用户与当前从Twitter登录的用户相同 .

  • 1

    我有同样的问题,虽然这不是一个完整的解决方案(我不认为一个真的是100%万无一失),这就是我现在正在建设的 .

    示例:具有用户名/密码,Facebook和Twitter的站点以进行身份验证 .

    用户访问该站点并想要注册 . 他们使用Twitter注册进行身份验证 . Twitter传递除电子邮件地址之外的一堆信息 . 我正在存储我认为可用于比较的配置文件信息(位置,名称等) . 在验证之后立即向用户呈现简档页面以验证简档信息(他们可以移除他们不想存储的任何信息) . 他们还有机会添加其他身份验证方法(在这种情况下,用户名/密码和Facebook) . 您鼓励他们在登录时链接其他身份验证方法的次数越多,您对重复帐户的麻烦就越少 . 然而,它仍然作为边缘情况存在 .

    边缘案例的情况如下:用户使用Twitter注册然后立即注销并尝试签名在使用Facebook . 登录方法检测到这是一个新的身份验证,因此它将来自Facebook的oauth数据与现有的配置文件信息进行比较,并尝试查找匹配项 . 然后,我显示前10个左右的匹配项,并要求用户验证它们是否已存在,以便可以链接该帐户 . 让用户使用Twitter登录,然后链接Facebook帐户 .

    显然,如果每个人使用相同的电子邮件地址并且Twitter实际上会返回电子邮件地址,这将更容易和更简单 . 但不是每个人都这样做,所以你必须以最好的方式处理这个边缘情况 - 此时我会尝试匹配选项,只是推动用户在注册并填写 Profiles 信息时与其他服务进行身份验证 .

相关问题