反正有没有找到登录用户是相同的 - Oauth

时间:2014-02-20 07:59:31

标签: ruby-on-rails facebook twitter oauth ruby-on-rails-4

我正在使用Oauth gem登录我的网络应用程序,使用Facebook,Twitter和谷歌帐户。为此,我在每个项目中创建了一个项目,并获得了app id和secret id。我希望在我的数据库中只有一个条目,即使用户在三者中都使用相同的邮件ID登录。我们将以下信息存储在数据库中(电子邮件,名称,提供商,uid)。问题是twitter不提供邮件ID。所以我计划从昵称生成邮件ID。

user.rb

//for facebook and google
user = User.create(name:auth.extra.raw_info.name,
                        provider:auth.provider,
                        uid:auth.uid,
                        email:auth.info.email,
                        password:Devise.friendly_token[0,20],
                      )

//for twitter
user = User.create(name: auth['info']['nickname'],
                        provider: auth.provider,
                        uid: auth.uid,
                        email: auth['info']['nickname'] + '@twitter.com',
                        password:Devise.friendly_token[0,20],
                      )

例如

我在facebook,twitter和google中使用邮件ID example@gmail.com登录。但在我的数据库中它创建了两个条目

11 | example@gmail.com                // for facebook and google

12 | nickname@twitter.com             // for twitter    

我没有这种行为。是否有任何其他可能的方法来找到登录用户是同一个人?我只想要一个条目。如果可能的话,请建议我任何更好的方法。

1 个答案:

答案 0 :(得分:0)

据我所知,目前这并不容易。如果Twitter和其他服务之间没有共同的信息,您如何自动关联它们?此外,如果您为通过Twitter登录的用户组成@twitter.com电子邮件地址,那么您的数据库中有一个无效/无法使用的电子邮件地址(除非该人是Twitter的员工并且碰巧有Twitter名称与其电子邮件地址的本地部分相同 - 但更糟糕的是,如果有人的Twitter名称与Twitter员工的电子邮件地址的本地部分匹配但不是该员工,则您有一个有效的电子邮件地址但是您网站上的用户并不拥有它 - 我不知道这是否可以随意使用,如果您正在使用:确认他们无法确认电子邮件地址。

你至少有几个选择:

  1. 当此人通过Twitter登录并返回您的网站时,请询问他们的电子邮件地址,以便检查他们是否已经注册了。
  2. 为来自Twitter的人们生成某种虚假的唯一电子邮件地址,您可以告诉他们以后是假的(因此您永远不会尝试确认或发送任何其他电子邮件)或允许空白电子邮件地址(可能有点棘手)设计,因为它通常假定为每个用户定义并存在电子邮件地址)。然后允许人们合并您网站上的任意帐户,方法是使用其中一个帐户登录,然后输入另一个帐户的凭据(凭证需要通过外部服务登录,因为他们不会知道您的自动帐户生成Devise.friendly_token密码,除非另一个帐户是直接在您的网站上注册的,如果您支持的话)。然后,您必须处理合并与这两个帐户关联的任何内容,这可能会很棘手,具体取决于您与模型中的用户关联的内容。
  3. 对于一个全面的系统,您可能希望允许人们合并任意帐户,例如,在Google和Facebook上使用不同的电子邮件地址注册同一个人的情况。

    此外,请注意,对于通过Facebook登录的用户,您不一定会从Facebook收到电子邮件地址。人们可以只使用电话号码在Facebook注册,因此在这种情况下Facebook没有他们的电子邮件地址。