Database design 在数据库中存储OpenID信息

Database design 在数据库中存储OpenID信息,database-design,openid,Database Design,Openid,这是一个数据库问题。我已经安装了一个openid库并正在运行 我想在我正在开发的网站上使用OpenID。有三种类型的用户 使用电子邮件/密码进行身份验证的命名帐户 使用OpenID进行身份验证的命名帐户 使用OpenID进行身份验证的匿名帐户 所有这些用户都存储在同一个表中,仅存储在comments表中。命名帐户链接到该帐户可以管理的博客。匿名用户可以在博客上评论文章,但他们不能做任何其他事情。如果一个匿名用户注册了一个帐户,我想自动将该用户的旧评论转移到指定帐户。目前,我正在让用户填写一份带有

这是一个数据库问题。我已经安装了一个openid库并正在运行

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

  • 使用电子邮件/密码进行身份验证的命名帐户
  • 使用OpenID进行身份验证的命名帐户
  • 使用OpenID进行身份验证的匿名帐户
  • 所有这些用户都存储在同一个表中,仅存储在comments表中。命名帐户链接到该帐户可以管理的博客。匿名用户可以在博客上评论文章,但他们不能做任何其他事情。如果一个匿名用户注册了一个帐户,我想自动将该用户的旧评论转移到指定帐户。目前,我正在让用户填写一份带有唯一名称和有效电子邮件的表格

    目前,这两组帐户使用以下模式存储在同一个表中。(是的,这是rails迁移)

    openid\u url
    是唯一的,以防止多个帐户附加到同一个openid。
    email
    是唯一的,因为用户使用电子邮件/密码登录)

    我在使用这个设置时遇到了谷歌OpenID实现的问题。使用Google for OpenID的每个用户都有相同的url:

    我如何支持使用google作为openid提供者,因为它的URL对于每个用户都不是唯一的?(请记住存在的约束)


    注意:谷歌账户可以使用互联网上任何有效的电子邮件地址,所以我不能只存储person@google.com在openid_url字段中,因为电子邮件可能是person@example.com或者更糟person@yahoo.com! Yahoo也使用这个单一url方法,所以我也必须支持它们。

    存储openid.id值。它是每个用户唯一的。谷歌OpenID确实是独一无二的。它们都以相同的值开始,但它们具有唯一的
    ?id=uniqueneshere
    查询字符串。请记住,这些值应视为区分大小写,因此在查找用户时保留大小写并按大小写匹配


    P>你绝对不想考虑电子邮件地址对于你所给的原因是独一无二的,而且对于大多数供应商来说,电子邮件地址没有预先验证(或者你不能相信供应商已经这样做了)。因此,存储在电子邮件地址上是一种确保用户身份被盗的方法。

    此处不需要openid\u url。只有UserID或name(unique)适用于这两个帐户。
    您还可以从UserAccount表中使用openid和userid创建单独的表。

    为什么说电子邮件地址是唯一的?他们可能不是。如果您看到第二个openid登录,并且用户声称与您已有的电子邮件地址相同,该怎么办?电子邮件用于不使用openid的命名帐户。此后,我将我的应用程序更改为仅使用openid。(我认为有足够多的人拥有谷歌/雅虎账户,我不会对此有异议。)
    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