将 openID 和 oauth 集成为网站登录、登录和认证系统
Posted
技术标签:
【中文标题】将 openID 和 oauth 集成为网站登录、登录和认证系统【英文标题】:Integrating openID and oauth as website login, signin and authentication system 【发布时间】:2011-09-06 14:38:19 【问题描述】:首先让我先说这个问题与不同的 openID 和 oAuth 实现无关。有很多关于这些的课程。
我的问题是验证用户后该怎么做:
如何将此用户添加到数据库的用户表中? 如何处理同一用户的不同登录? (Remy Sharp 的 example 建议 openID 的东西) 如何在数据库中结合oAuth和openID?有什么想法吗?
【问题讨论】:
您必须决定采用某种方式来协调不同的登录凭据——这通常是通过使用用户的电子邮件作为 oAuth 和 openID 用户之间的唯一 serogate 密钥来完成的。 【参考方案1】:你的问题必须是主要部分:
-
身份验证
授权
如果身份提供者 (IP) 是您自己的,则通常不会对两者进行区别对待,这是迄今为止网络应用程序中最常见的设置。
使用诸如 Google 之类的 OpenId Provider 时,身份验证部分与您的控制分开。您将收到一个令牌,告诉您用户是否已通过身份验证。令牌通常包含以下声明:姓名、电子邮件和命名身份,其中最后一个是 IP 处身份的唯一 ID。
到目前为止一切顺利。
现在的诀窍是,我如何授权这个用户?
嗯,有几种方法可以解决这个问题。
首先,当您在系统中创建本地用户时,您可以根据从 IP 获得的声明预填充名称和电子邮件值。在此过程中,您可以开始并说所有在您的系统中存储有个人资料的用户都已获得授权,或者您可以开发进一步的流程来添加您需要了解的有关用户的任何详细信息。
那么,如果用户从google切换到facebook作为IP,如何避免用户重新注册?
这就是事情变得棘手的地方。谷歌、雅虎、Facebook 向您提供的最常见的声明是电子邮件地址和姓名。因此,您可以做的是尝试将传入声明与您应用中的现有客户相匹配。然而,这并不是万无一失的,因为人们可以在不同的系统中拥有不同的电子邮件。
名称值也不安全。
在我们的设置中,我们首先匹配电子邮件,因为我们知道大多数 IP 都会验证电子邮件地址。这将大大减少重复。在那次检查之后,我们开始我们自己的验证过程,目标是查看这个人是否已经注册。此过程在我们的数据库中查找客户的手机号码,如果找到匹配项,我们会向客户发送一次性密码以验证电话号码的正确所有权。
由于登录是一个时间敏感的设置,我们创建了一个简单的 SQL 表,将外部身份映射到我们的客户编号。这允许我们在所有 Web 应用程序之外实现这种验证逻辑(从而减少代码冗余)
【讨论】:
【参考方案2】:对我来说,最简单的方法似乎是拥有一个基本的用户表,您可以在其中添加用户注册并拥有一个额外的 1:n 表,您可以在其中保存可能的身份验证。也许你需要不止一张表,如果有方法,它需要比其他更多的列。
【讨论】:
【参考方案3】:我通过谷歌的 OpenID 实现了登录并遇到了类似的问题。我使用了来自 janrain 的 openid library。
我没有为 openid 创建单独的表。我改用辅助电子邮件(辅助电子邮件存储在用户表中)。
通过 google 登录时,可以要求用户提供电子邮件(我相信任何其他 openid 提供商都有相同的机会)。在我从谷歌得到用户登录的响应后,我查看用户表。如果在表中找到提供的电子邮件(无论是主要还是次要),我都会登录用户。如果找不到电子邮件,我会询问用户是否有帐户。如果是,建议他使用现有的登录名/密码登录,然后我向用户添加辅助电子邮件。如果用户没有帐户,则会创建一个新帐户。
因此,这些技巧不需要特殊的新表。
【讨论】:
电子邮件可能会发生变化。唯一不变的唯一声明是来自提供者的命名身份。 (例如您在 google 或 facebook 的用户名)以上是关于将 openID 和 oauth 集成为网站登录、登录和认证系统的主要内容,如果未能解决你的问题,请参考以下文章
托管应用程序的 Google 联合登录 (OpenID+Oauth) - 更改端点?