将Open ID与我当前的登录系统合并?

时间:2009-10-18 10:27:00

标签: php mysql database-design openid

我目前正在我的网站上设置Open ID身份验证,我在将其与当前的登录系统和数据库相结合时遇到了麻烦......我已经阅读了Plaxo&它推荐这种类型的表来存储openid信息...

create table user_openids (
  openid_url varchar(255) not null,
  primary key (openid_url),

  user_id int not null,
  index (user_id)
);

这是我当前的用户信息表

Userid(PRIMARY) | username(UNIQUE) | password | Email

Userid用于引用评论,评级等的用户详细信息(因此它作为用户标识符进入评论表和评级表)

我想要一个类似于Stack overflow使用你的Open ID登录的系统,它会给你一个未知的(OPENID-provider)显示名称....同时保持我当前的登录系统完好无损。
1)如何在不影响当前登录设置的情况下,将用户的Open ID详细信息添加到当前用户信息表中?
2)目前我使用User-id(为每个用户生成唯一的)来存储在会话中以维护Login。如果是Open ID,我现在该怎么办?

*我的想法(我不知道我是否对不对)
- 添加一个open-id字段,用于存储每个用户的open id提供程序提供的唯一open id url,并为非open-id-users设置为null。 - 将User-id设为文本字段并存储open id url的md5。(将其存储在会话中以维护登录)。
- 我不知道如何处理为每个用户设置为唯一的显示名称/用户名,因为我想显示未知(OPENID_provider)(对于使用open-id的用户),这可能是已从配置文件设置更改...

任何建议都会有所帮助....谢谢

3 个答案:

答案 0 :(得分:2)

您展示的表格布局的想法是从用户那里获得1:多个:openids。

因此,不需要更改用户表。

当有人使用OpenID登录时,您检查该OpenID是否在openids表中。如果是这样,那么您拥有该用户的user_id,并且您已完成。

否则创建一个新用户(没有设置用户名/密码)并在openids表中插入(openid,user_id)对。

您的模板可以显示任何好的占位符(例如他们的OP或其他),它通常会显示用户名为空的用户的用户名。

希望您已经禁止使用空白密码登录,因此应该没有安全问题。

答案 1 :(得分:1)

这个怎么样?

  • display_name列添加到users表,该表不必是唯一的。
  • username可选
  • 中设置passwordusers
  • 当有人注册OpenID时,在users中创建一行,其中包含空用户名/密码,显示名称设置为“unkonwn(provider)”。
  • 允许用户设置用户名/密码,如果他们想切换到基于密码的登录。
  • 允许用户管理其OpenID,以便现有用户可以切换到基于OpenID的登录。

这意味着用户可以拥有用户名/密码,但他们没有。它们也可以有一个或多个OpenID,但它们不必。他们可以使用非唯一的显示名称。

答案 2 :(得分:1)

选项1:只允许一种登录类型

这是我的建议(更新以防止需要编辑与username相关的所有业务逻辑):

  1. 创建一个名为loginid的新列,以允许存储OpenID和旧用户名,同时在此列中添加UNIQUE INDEX
  2. 使用loginid
  3. 中的现有数据填充username 来自DELETE INDEX
  4. username允许它们是非唯一的。从OpenID创建新用户时,请按照说明将username值设置为unknown(google)。
  5. 保留password旧版登录,忽略OpenID。
  6. 仅更新代码的AUTH部分以查找loginid而非用户名。
  7. 选项2:允许多次登录 (也可以轻松扩展到链接来自不同来源的多个配置文件)

    1. 创建一个新表作为主用户表,并包含每个用户的所有必填字段(可能是上述示例中的email)。
    2. 创建一个表来存储身份验证,其中包含:useridFK到主记录),username(存储适合登录方案的用户名),password
    3. 这两个选项都有明显的缺陷,但它有望让你开始朝着正确的方向前进。