在数据库中存储OpenID信息

时间:2009-10-08 13:54:23

标签: database-design openid

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

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

  1. 使用电子邮件/密码进行身份验证的帐户
  2. 使用OpenID进行身份验证的命名帐户
  3. 使用OpenID进行身份验证的匿名帐户
  4. 所有这些用户都存储在同一个表中,只是注释表。已命名的帐户会链接到该帐户可以管理的博客。匿名用户可以对博客上的文章发表评论,但他们无法做任何其他事情。如果匿名用户注册了某个帐户,我想自动将该用户的旧评论转移到指定帐户。我目前通过让用户填写具有唯一名称和有效电子邮件的表单来实现此目的。

    目前,两组帐户都使用以下架构存储在同一个表中。 (是的,它是铁路迁移)

    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帐户可以使用互联网上的任何有效电子邮件地址,因此我不能将person@google.com存储在openid_url字段中,因为电子邮件可能是person@example.com或更糟的是person@yahoo.com!雅虎也使用这种单一的网址方法,所以我也必须支持它们。

2 个答案:

答案 0 :(得分:8)

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

由于您提供的原因,您绝对不希望将电子邮件地址视为唯一,而且对于大多数提供商而言,电子邮件地址未经过预先验证(或者您无法信任提供商已完成此操作),因此存储在电子邮件地址上可以确保用户的身份被盗。

答案 1 :(得分:-1)

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