在数据库中存储OpenID信息

epo*_*olf 7 openid database-design

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

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

  1. 使用电子邮件/密码进行身份验证的命名帐户
  2. 使用OpenID进行身份验证的命名帐户
  3. 使用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
Run Code Online (Sandbox Code Playgroud)

(openid_url唯一的做法是防止多个帐户被连接到同一个openid.这email是唯一的,因为用户使用电子邮件/密码登录)

我正在使用此设置我遇到了Google的OpenID实施问题.使用Google for OpenID的每个用户都具有相同的网址:https://www.google.com/accounts/o8/ud.

我如何支持使用谷歌作为openid提供商,因为它的网址并不是每个用户都是唯一的?(请记住存在的约束)

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

And*_*ott 8

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

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