将 mysql 用户身份验证替换为 openid


Replacing mysql user authentication with openid

所以,我正在使用一个非常旧的系统,它使用一个人的mysql数据库凭据来向网站进行身份验证(数据库最初只能从命令行访问,但现在可以从php前端访问)。由于一些内部原因(并保留用户的历史记录),我必须保持旧的身份验证不变。我被指控向这个系统添加openid身份验证。不知何故,我需要能够在通过 openid 登录站点时检索用户的 mysql 用户名和密码(顺便说一下,使用 Zend 框架)。我想过在第一次登录时简单地要求注册,用户必须提供他们的 mysql 凭据,但我宁愿不存储密码纯文本。我还考虑过清空每个人的mysql密码,只需手动设置用户的mysql用户名(而不是让用户提供这个,因为他们可以提供任何用户名)。这正在变成一场安全噩梦。有人对替代方案有任何建议吗?

顺便说一下,这是在Linux服务器上运行的。另外,我无法使用mysql可插拔身份验证,因为mysql版本是5.0(可插入身份验证需要mysql 5.5),不,我无法更新它。

MySQL密码是散列的,因此您将无法从MySQL中提取明文密码。我想这给你留下了两个选择,你在问题中都考虑了:

  • 用户首次使用 OpenID 登录时,将 MySQL 中的用户密码替换为应用程序已知的新密码。您的应用程序使用该密码登录到使用 OpenID 的任何用户的帐户。

    缺点:使用OpenID的用户无法恢复使用直接MySQL身份验证,因为他们不再知道自己的密码。甚至不使用MySQL命令行工具。这意味着用户一旦使用OpenID,就必须永远使用OpenID。

  • 当用户注册使用 OpenID 时,您的应用程序会更改其密码。

    缺点:您的应用程序保留纯文本密码列表

    缺点:当用户自己更改其MySQL密码时,您的应用程序会中断。

第三种选择:

  • 对于每个使用 OpenID 的用户,为他们创建第二个 MySQL 用户,该用户具有通用密码。将分配给普通帐户的所有权限复制到此"影子"帐户。

    缺点:普通用户和影子用户必须保持同步,这样,如果从一个中添加或撤销某些MySQL权限,也应该同时从另一个中添加或撤销它们。忘记这样做会导致一团糟。

鉴于您无法明智地为 CLI 客户端执行 openid 身份验证(即使使用 PAM),我强烈建议您不要尝试将 openid 用户与 mysql 用户进行协调 - 只需添加一个通用用户,任何通过 openid 进行身份验证的人都可以使用它连接到数据库。