使用OpenID作为唯一的身份验证方法

时间:2010-04-08 17:22:35

标签: openid rpxnow rpx

我已经阅读了其他问题,他们主要谈论这样做的安全性。这并不完全是我的担心,主要是因为该网站的问题是基于浏览器的游戏。但是,更大的问题是用户 - 并非每个用户都有足够的文字来理解OpenID。当然RPX使这很容易,这就是我将要使用的,但是如果用户没有Google或Facebook上的帐户或者不信任系统使用现有帐户登录该怎么办?他们必须在另一个提供帐户 - 我相信大多数人都会知道如何这样做,更不用说为此而烦恼了。

还有如何在应用程序中管理它的问题。用户可能希望在单个帐户中使用多个身份,因此不像处理用户名+密码那么简单。如何在数据库中存储用户的OpenID标识?使用OpenID也给我一个好处:RPX可以提供广泛的配置文件信息,因此我可以预填充配置文件表单并要求用户根据需要进行编辑。

我目前有这个:

Users:
------

ID     Email              Etc.
--     ---------------    ----
0      bob@yahoo.com      ...
1      alice@yahoo.com    ...

UserOpenIDs:
------------

ID     UserID     OpenID
--     ------     ------
0      0          0
1      0          2
2      1          1

OpenIDs:
--------

ID     Provider   Identifier
--     --------   ----------------
0      Yahoo      https:\\me.yahoo.com\bob#d36bd
1      Yahoo      https:\\me.yahoo.com\alice#c19fd
2      Yahoo      https:\\me.yahoo.com\bigbobby#x75af

使用这些外键:

UserOpenIDs.UserID -> Users.ID
UserOpenIDs.OpenID -> OpenIDs.ID

这是在数据库中存储OpenID标识符的正确方法吗?我如何匹配RPX给我的标识符以便在数据库中登录用户(如果标识符已知)。

所以这里有具体的问题:

  • 如何让没有OpenID或不想使用OpenID的用户可以访问它? (安全问题,例如,使用他们的Google帐户登录)
  • 如何将标识符存储在数据库中? (我不确定上面的表格是否正确)
  • 我需要采取哪些措施来阻止某人以其他用户身份登录并愉快地使用其帐户执行任何操作? (据我所知,RPX通过HTTP发送标识符,所以任何人都要做的就是以某种方式抓住它然后在“OpenID”字段中输入它)
  • 使用OpenID时还需要注意什么?

3 个答案:

答案 0 :(得分:4)

让它可访问

首先,关于没有OpenID的用户,您可以创建一个小页面来解释如何创建帐户(甚至指向某些提供商)。这样,创建OpenID帐户并不比普通帐户更难。

对于不想使用OpenID的人,您有两种选择。 第一种:在OpenID登录旁边实现旧式登录,让用户选择他们想要的方法。 第二个是只有OpenID ......这简化了你的工作。 我认为有些用户信任的网站多于受信任的OpenID提供商,因此OpenID提供商经常使用加密连接等等,这是非常奇怪的......

存储在数据库中

johnny g 提出的架构是您所需要的。 (我只是不知道你为什么用反斜杠而不是斜杠存储URL)

您可能希望在使用之前规范化您的网址,这样您就可以避免将http://openid.test.com/abchttp://openid.test.com/abc/视为不同的网址。

采取的其他措施

无。 您应该使用http://openid.net/developers/libraries中的库。

确认用户身份是提供商的问题。 只有用户和网站知道该帐户的密码。

如果有人拥有您的OpenID网址(公开),他仍然需要密码(或其他类型的身份验证方法,例如SSL证书)才能登录。

答案 1 :(得分:3)

Arg,回答我上面的评论。

对于您的第三个问题“措施......以防止某人以其他用户身份登录...”,据我了解OpenId,您从不接受来自不受信任来源的OpenId Url。在实施过程中,您的网站会托管提供商的登录信息,提供商的网站会直接与您联系 ,因此您始终会接受来自受信任网站的OpenId网址。

换句话说,即使恶意用户收集像Pokemon这样的OpenIds,他们也无法访问您的系统。

对于您的第二个问题“我如何存储...”您的架构将起作用,尽管它看起来有点放松。例如,通过使用多对多映射[ie UserID to OpenID],您允许用户属于许多OpenId,并且单个OpenId属于许多用户。你想要前者没有后者。

一个简单的外键约束就足够了。

UserID     Email        
------     --------------- 
86000      bob@yahoo.com 
86001      alice@yahoo.com 

UserID     Identifier 
------     ---------------- 
86000      https:\\me.yahoo.com\bob#d36bd 
86000      https:\\me.yahoo.com\bigbobby#x75af 
86001      https:\\me.yahoo.com\alice#c19fd

如果UserIDUsers表的外键,并且Identifier上有唯一的键约束,这实际上表明User拥有零或多个唯一Identifier 1}}秒。原则上,我可能也会在那张桌子上拍一张主键,但这很重要。

希望这会有所帮助:)

PS 如果您对集成或利用OpenId有疑问,请逐步完成实施。确定接收OpenId Url的每一个源,然后问自己恶意用户是否有可能访问该入口点。我希望只有一个这样的入口点,除了可信的OpenId提供者之外,每个人都无法访问它。

答案 2 :(得分:-1)

我注意到第一个问题的一个答案:

如果用户不能或不想使用OpenID,请与现有提供商合作并直接在网站上注册,或者自己成为提供商(尽管这意味着拥有经典的用户名+密码帐户,以及有点遗漏了问题的关键点 - >只使用OpenID)。