【问题标题】:Storing OpenID information in database在数据库中存储 OpenID 信息
【发布时间】:2010-12-05 00:12:28
【问题描述】:

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

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

  1. 使用电子邮件/密码进行身份验证的命名帐户
  2. 使用 OpenID 进行身份验证的命名帐户
  3. 匿名帐户使用 OpenID 进行身份验证

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

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

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 获取 OpenID 的用户都有相同的 URL:https://www.google.com/accounts/o8/ud

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

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

【问题讨论】:

  • 为什么说电子邮件地址是唯一的?他们可能不是。如果您看到第二次 openid 登录并且用户声称与您已有的电子邮件地址相同,该怎么办?
  • 电子邮件用于未使用 openid 的命名帐户。从那以后,我将我的应用程序更改为专门使用 openid。 (我认为有足够多的人拥有 google/yahoo 帐户,我对此不会有任何问题。)

标签: database-design openid


【解决方案1】:

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

由于您提供的原因,您绝对不想认为电子邮件地址是唯一的,而且对于大多数提供商来说,电子邮件地址没有经过预先验证(或者您不能相信提供商已经这样做了),因此存储电子邮件地址是窃取用户身份的可靠方法。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-11-28
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2011-06-19
      • 2015-04-26
      • 2021-09-17
      相关资源
      最近更新 更多