OpenID:如何最好地将多个OpenID账户关联到一个用户?

23

我是一个openID的新手。我花了很多时间思考如何最好地为用户提供选择,以使用各种开启OpenID的帐户进行登录。

(我必须进一步说明,我的系统不是只需要进行简单“一次身份验证”即可进行博客发布的系统,而是像社交网络网站一样的完整系统,用户将始终添加更多信息并编辑现有信息以“他的个人帐户”...因此系统本身需要具有与用户所做工作相关联的某种“帐户”)

考虑到以下情况:我不创建“专用于mysite的带有密码和用户名的用户帐户”,而仅依赖于openID登录,那么我遇到了以下问题: 当用户“A”第一次通过“Google帐户”登录时,他所做的所有事情都将与Google帐户相关联。 当他回来并且不点击“Google帐户登录”,而是点击“Yahoo登录”,他将被签入但将创建/获取与Yahoo相关联的新帐户。 他使用Google帐户做的所有事情似乎都会丢失。 简单地向每个用户发放一个“独立的openID和唯一的用户名”(无需密码)在我的网站上不起作用:因为如果我在登录时要求这个唯一的用户名(没有密码),每个人都可以猜测其他人的用户名并将OpenID与他们相关联。 但是,如果我还必须为此用户名设置密码,那么我最终会回到没有OpenID的过去:然后我必须向用户发放某种“主帐户”(带有用户ID和密码),以便他可以方便地将其与任意数量的openId帐户相关联。 但出于什么原因我想要在这种情况下使用openID? 因为用户无论如何都必须记住“我的主密码和用户名”...

=>这是否意味着,openID不“直接”支持“自由选择”多个帐户? 如果我希望用户能够使用任意openID用户帐户登录(每个单独的登录),唯一的方法是这样做:

1.)用户通过“已知的openID帐户”登录=>没问题,不需要做任何事情

2.) 用户通过“未知openID帐户”登录=> 通过“未知” openId(例如Yahoo)对用户进行身份验证,但当用户回到我的网页时,向用户说明这个(Yahoo) openID 帐户是未知的(=与其它帐户没有关联=就像一个新帐户),然后问他是否上一次使用了其他帐户登录,并提供支持的 openID 帐户列表。用户随后可以选择他上次使用的提供者之一(例如Google)。他除了已经用 Yahoo 登录外,还必须登录上次使用的“旧”(Google)帐户。然后两个帐户就被“关联在一起”,任何在旧(Google)帐户上的工作现在也可以通过新的(Yahoo)openID 帐户/登录访问。

或是否有其他方法来为一个用户帐户支持“多个 openID 帐户”?

(我询问原因:OpenID 对普通终端用户而言并不是很知名。如果我列出从 Google、Yahoo 到 Facebook 的大量登录列表,那么将有很多用户使用 Google 进行最初的登录,但下一次他们回来可能会选择 facebook(因为他们刚刚离开 Facebook 网站,单击 Facebook 图标更具吸引力)。这是“网站运作”的方式,持续了“15年”:只有一种登录方式:一个用户名输入字段和一个密码输入字段。如果我现在打印出一个用户在每个帐户上都有帐户的大型列表,则可能会从一天到下一天使用不同的帐户登录而不了解这将导致的问题。因此,理想的世界是用户可以通过我的 openID 提供程序列表中的任意帐户进行登录,并将所有帐户“关联”起来...

我希望我能够清楚地描述我的问题。

我非常感谢您的帮助和想法(也许我对这里的某些事情完全误解了)

非常感谢! Jan

4个回答

14

是的,用户需要同时使用两者登录。

  1. 用户首次使用Google账户登录,使用应用程序并注销。应用程序会创建一个内部用户登录(在grombeestje的用户表中)并将其与Google账户关联(在grombeestje的openid表中)。
  2. 稍后,用户已使用Yahoo登录,并再次使用Yahoo账户登录。现在用户被要求通过其他服务进行身份验证。
    • a. 用户选择Google账户并选择接受。
    • b. 用户使用Google账户登录。
    • c. 应用程序将Google id附加到当前登录。

此外,用户可以随时选择添加登录到他的个人资料,并识别他/她的其他openID,比如Blogger、Facebook等。如果他使用这些账户创建了不同的本地登录(在grombeestje的用户表中),则他可以删除其中一个或将它们合并成一个。


非常好的回答!首先,您实际上回答了手头的问题。其次,在您最后一段中提出了一个很好的观点,即如果两个内部帐户在初始登录后的某个时候关联在一起,则有合并它们的责任。这是我需要考虑的事情。谢谢! - TalkLittle

8

OpenID是一种身份验证机制,而不是个人资料存储机制。在您的网站上仍然应该拥有一个唯一标识符,并且应该以与存储与该唯一标识符相关联的密码相同的方式维护一个记录,该记录存储与该唯一标识符相关联的OpenID。


你好Jeremy,感谢你的回答。但是在实践中,我如何将唯一标识符与多个帐户关联起来呢?唯一的方法是要么为唯一标识符关联一个密码(=>拥有某种完整的主帐户),要么按照我上面描述的方式进行。但是,如果我发出某种“主帐户”,那么OpenID只是一种“有趣的小玩意”,因为用户仍然必须记住我的唯一标识符和密码。否则,就没有可能“安全地”将几个OpenID帐户相互关联。 - jan
你的认证模型应该只是一个“认证模型”。它不应该决定你如何管理用户,只应该决定如何对他们进行身份验证。你需要一个唯一标识符(UID),以便确定连接到系统的确切用户。即使是SO也使用他们生成的UID(例如65228),并且他们存储了OpenID和他们的UID之间的连接。你遇到的问题是因为你正在使用OpenID作为UID。知道今天使用Facebook的用户与昨天使用Google的用户是同一个人的唯一方法是让他们首先用Google登录。 - Jeremy S

6
在您的数据库中有一个包含用户账户的表格,其中包括用户ID,并且有一个链接表格,将OpenID与用户ID链接起来。
例如:
用户表格
ID 名字 1 PIET 2 KEES
OpenID表格
OPENID USERID http://..... 1 http://..... 1 http://..... 2 http://..... 2

你好,grombeestje,感谢你的回答。如果您能详细说明如何将用户表与特定用户的OpenID表进行关联,那就太好了:您是按照我在问题中描述的方式进行,还是提出了更好的解决方案? - jan

2
似乎您需要让用户使用两个账户登录才能将它们连接在一起。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接