2011-06-01 121 views
16

首先让我开始说,这个问题不是关于不同的openID和oAuth实现。有很多关于这些的课程。将openID和oauth集成为网站登录,登录和身份验证系统

我的问题是验证用户后做什么:

  • 如何在数据库中将此用户添加到用户表?
  • 如何处理同一用户的不同登录名? (Remy Sharp的example建议 东西为openID)
  • 如何在数据库中结合oAuth和openID?

任何想法?

+2

您必须决定如何协调不同的登录凭证 - 这通常是通过使用用户的电子邮件作为oAuth和openID用户之间独特的serogate密钥。 – colinross 2011-06-01 20:09:23

回答

12

你的问题有主要部分是:

  1. 认证
  2. 授权

通常情况下,两者没有区别对待,如果身份提供者(IP)是你自己的,里面有直到现在,它一直是Web应用程序中最常用的设置。

使用OpenId提供程序(如Google)时,身份验证部分与您的控件分离。您将收到一个令牌,告知您用户是否已通过身份验证。令牌通常包含以下声明:姓名,电子邮件和命名身份,其中最后一项是IP上身份的唯一ID。

到目前为止这么好。

诀窍是现在你问,如何授权此用户

好吧,有几种方法来解决这个问题。

首先,当您在系统中创建本地用户时,您可以根据您从IP获得的声明预填充名称和电子邮件值。在这个过程中,你可以开始说所有拥有存储在系统中的配置文件的用户都是经过授权的,或者你可以开发更多的进程来添加你需要了解的用户信息。

那么,你如何避免用户不重新注册,如果他们从谷歌切换到Facebook的IP?

这是事情变得棘手的地方。 Google,Yahoo,Facebook将向您提供的最常见的声明是电子邮件地址和名称。因此,您可以做的就是尽量使您的应用程序中的现有客户与最初的索赔相匹配。然而,这不是安全的,因为人们可以在不同的系统中使用不同的电子邮件。

名称值也不安全。

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

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

8

最简单的方法对我来说似乎对我来说有一个基本的用户表,在注册时添加用户,并有一个额外的1:n表保存可能的身份验证。也许你需要多个表,如果有方法,需要比其他方法更多的列。

0

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

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

虽然通过谷歌登录可以要求用户的电子邮件(我相信在任何其他openid提供商都有相同的机会)。在我从google获得用户登录的响应后,我查看了用户的表格。如果在表中找到电子邮件(无论它是主要还是次要都无关紧要),我登录该用户。如果找不到电子邮件,我会询问用户他是否有帐户。如果是的话,他建议用现有的登录名/密码登录,然后给用户添加辅助邮件。如果用户没有帐户,则创建新帐户。

所以你不需要特殊的新表。

+1

电子邮件可能会更改。唯一不变的唯一要求是来自提供商的指定身份。 (例如你的用户名在谷歌或脸书) – 2011-06-08 06:07:10