集成openID和oauth作为网站登录、登录和身份验证系统


Integrating openID and oauth as website login, signin and authentication system

首先让我说,这个问题与不同的openID和oAuth实现无关。有很多关于这些的课程。

我的问题是在验证用户后该怎么办:

  • 如何将此用户添加到数据库中的用户表中
  • 如何处理同一用户的不同登录(雷米·夏普的例子表明openID)
  • 如何在数据库中组合oAuth和openID

有什么想法吗?

你的问题有几个主要部分:

  1. 身份验证
  2. 授权

如果身份提供商(IP)是你自己的,通常这两者不会有区别,这是迄今为止网络应用程序中最常见的设置。

当使用OpenId提供程序(如Google)时,身份验证部分与您的控制是分开的。您将得到一个令牌,告诉您用户是否已通过身份验证。令牌通常包含以下声明:名称、电子邮件和命名标识,其中最后一个是IP上标识的唯一id。

到目前为止还不错。

现在的问题是,我如何授权该用户

有几种方法可以解决这个问题。

首先,当您在系统中创建本地用户时,您可以根据从IP获得的声明预先填充"名称"answers"电子邮件"值。在这个过程中,您可以开始说,所有在您的系统中存储了配置文件的用户都已获得授权,或者您可以开发进一步的过程,添加您需要了解的有关用户的任何详细信息。

那么,如果用户从谷歌切换到facebook作为IP,你如何避免他们没有重新注册?

这就是事情变得棘手的地方。谷歌、雅虎、脸书将向您提供的最常见的声明是电子邮件地址和姓名。因此,你可以做的是,尝试将不兼容的声明与应用程序中的现有客户相匹配。然而,这并不是故障保护,因为人们可以在不同的系统中拥有不同的电子邮件。

名称值也不安全。

在我们的设置中,我们从匹配电子邮件开始,因为我们知道大多数IP都会验证电子邮件地址。这将大大减少重复。检查之后,我们开始自己的验证过程,目标是查看此人是否已经注册。这个过程在我们的数据库中查找客户的手机号码,如果找到匹配的号码,我们会向客户发送一次性密码,以验证电话号码的正确所有权。

由于登录是一个时间敏感的设置,我们创建了一个简单的SQL表,将外部身份映射到我们的客户号码。这使我们能够在所有web应用程序之外实现这种验证逻辑(从而减少代码冗余)

对我来说,最简单的方法是有一个基本的用户表,在其中添加注册用户,并有一个额外的1:n表,在那里保存可能的身份验证。也许您需要多个表,如果有方法的话,这些方法需要比其他方法多得多的列。

我通过谷歌的OpenID实现了登录,也遇到了类似的问题。我使用了janrain的openid库。

我没有为openid创建单独的表。我使用了二级电子邮件(二级电子邮件存储在用户表中)。

在通过谷歌登录时,可以要求用户发送电子邮件(我相信任何其他openid提供商都有同样的机会)。在我从谷歌得到用户登录的回复后,我查看了用户表。如果在表中找到了提供的电子邮件(无论是主要还是次要),我会登录用户。如果没有找到电子邮件,我会询问用户是否有帐户。如果是,建议他使用现有登录名/密码登录,之后我向用户添加第二封电子邮件。如果用户没有帐户,则会创建一个新帐户。

所以你不需要专门的新桌子来玩这些把戏。