2009-10-08 99 views
7

这是一个数据库问题。我有一个已经安装并正在运行的openid库。在数据库中存储OpenID信息

我想在我正在使用的网站上使用OpenID。有三种类型的用户。

  1. 使用电子邮件/密码使用OpenID使用OpenID认证
  2. 匿名帐户验证
  3. 命名帐户命名帐户验证

所有这些用户都存储在同一个表中简单地评论表。已命名的帐户链接到该帐户可以管理的博客。匿名用户可以评论博客上的文章,但他们无法做任何其他事情。如果匿名用户注册一个帐户,我想自动将该用户的旧评论转移到指定的帐户。我目前正在通过让用户填写具有唯一名称和有效电子邮件的表单来做到这一点。

当前两组帐户使用以下模式存储在同一个表中。 (是的,它是一个轨道迁移)

create_table :users do |t| 
    t.string :name #unique because it maps to a subdomain 
    t.string :openid_url #unique 
    t.string :email #unique 
    t.string :password_hash 
    t.string :password_salt 
    t.boolean :guest #Anonymous user flag 

    t.timestamps 
end 

openid_url是独一无二的,以防止多个账户被连接到相同的OpenID。email是独一无二的,因为用户使用电子邮件/密码登陆)

我用这设置我遇到了Google OpenID实施中的问题。每位使用Google for OpenID的用户都有相同的网址:https://www.google.com/accounts/o8/ud

如何支持将Google作为openid提供商使用,因为它对于每个用户来说都不是唯一的? (请记住存在的限制)

注意:Google帐户可以使用互联网上的任何有效电子邮件地址,因此我不能只将[email protected]存储在openid_url字段中,因为电子邮件可能是person @ example。 com或更糟糕的[email protected]!雅虎也使用这种单一的URL方法,所以我也必须支持他们。

+0

你为什么说电子邮件地址是唯一的?他们可能不是。如果您看到第二个openid登录并且用户声明与您已拥有的电子邮件地址相同的电子邮件地址,该怎么办? – 2009-10-08 15:46:17

+0

电子邮件是用于不使用openid的指定帐户。我已经改变了我的应用程序专门使用openid。 (我认为足够的人有谷歌/雅虎帐户,我不会有这个问题。) – epochwolf 2009-10-08 18:32:44

回答

8

存储openid.claimed_id值。它是每个用户唯一的。 Google OpenID确实是独一无二的。他们都以相同的价值开始,但他们有独特的?id=uniquenesshere querystrings。请记住,这些值应该被视为区分大小写,因此在查找用户时保留大小写并匹配大小写。

你绝对不会因为你给的理由而认为电子邮件地址是独一无二的,而且对于大多数提供者而言,电子邮件地址没有经过预先验证(或者你不能相信提供者已经这么做)所以存储在电子邮件地址是一种确保用户身份被盗的方法。

-1

openid_url在这里是不需要的。只有用户ID或名称(唯一)适用于这两个帐户。 您也可以使用UserAccount表中的openid和userid创建单独的表。

相关问题