我已经阅读了其他问题,他们主要谈论这样做的安全性。这并不完全是我的担心,主要是因为该网站的问题是基于浏览器的游戏。但是,更大的问题是用户 - 并非每个用户都有足够的文字来理解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给我的标识符以便在数据库中登录用户(如果标识符已知)。
所以这里有具体的问题:
答案 0 :(得分:4)
让它可访问
首先,关于没有OpenID的用户,您可以创建一个小页面来解释如何创建帐户(甚至指向某些提供商)。这样,创建OpenID帐户并不比普通帐户更难。
对于不想使用OpenID的人,您有两种选择。 第一种:在OpenID登录旁边实现旧式登录,让用户选择他们想要的方法。 第二个是只有OpenID ......这简化了你的工作。 我认为有些用户信任的网站多于受信任的OpenID提供商,因此OpenID提供商经常使用加密连接等等,这是非常奇怪的......
存储在数据库中
johnny g 提出的架构是您所需要的。 (我只是不知道你为什么用反斜杠而不是斜杠存储URL)
您可能希望在使用之前规范化您的网址,这样您就可以避免将http://openid.test.com/abc和http://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
如果UserID
是Users
表的外键,并且Identifier
上有唯一的键约束,这实际上表明User
拥有零或多个唯一Identifier
1}}秒。原则上,我可能也会在那张桌子上拍一张主键,但这很重要。
希望这会有所帮助:)
PS 如果您对集成或利用OpenId有疑问,请逐步完成实施。确定接收OpenId Url的每一个源,然后问自己恶意用户是否有可能访问该入口点。我希望只有一个这样的入口点,除了可信的OpenId提供者之外,每个人都无法访问它。
答案 2 :(得分:-1)
我注意到第一个问题的一个答案:
如果用户不能或不想使用OpenID,请与现有提供商合作并直接在网站上注册,或者自己成为提供商(尽管这意味着拥有经典的用户名+密码帐户,以及有点遗漏了问题的关键点 - >只使用OpenID)。