存储oauth和本地身份验证方法的最佳实践?

Hoo*_*pes 19 mysql facebook oauth-2.0 twitter-oauth

如果我要运行允许用户通过"本地"用户名/密码组合以及任何数量的OAuth服务进行身份验证的服务 - 该用户数据模型可能是什么样的?

通常,如果我自己处理所有登录,在"用户"数据库(假设MySQL)中,用户名和密码字段将被要求为非空.但是,如果我的用户只想登录Facebook,我只会存储Facebook自动令牌,而不是本地没有任何用户名/密码.

此外,如果他们想要使用Twitter信用卡登录,然后使用tumblr,然后进行任何当天的服务,该怎么办?我可以为每种类型保留一个字段,但这可能会有点笨拙.由于缺乏更好的术语,我是否会更好地保留另一个"身份验证方法"表,因此我可以在用户之间建立一对多关系以及如何对其进行身份验证?

基本上,我问的是,是否有人知道这种情况下的行业标准最佳实践,或者可以指出我正确的方向(或者如果某人已经实现了类似这样的适合他们的事情).一个用户,多种身份验证方法 - 保存该信息的最佳方式是什么?

如果我做出的任何假设无效,我道歉,请纠正我.

And*_*ird 8

我不知道我的解决方案是否接近任何行业标准,但之前我已在多个应用程序中完成此操作.

应用程序中的身份应该是来自身份验证源的抽象.我最终设置的是这样的:

User table:
id int
username varchar
email varchar
password varchar

Authentication profile table:
user_id int
service enum('website','google','facebook')
token varchar
Run Code Online (Sandbox Code Playgroud)

[为了进一步规范化,请使用服务元字段将服务作为自己的表.]

然后你的auth脚本做这样的事情:

  1. 寻找用户名/电子邮件
  2. 识别已知的身份验证配置
  3. 查看输入是否验证任何已知的身份验证配置文件和身份验证,或返回无效凭据

在某些服务的情况下,您需要自动生成某些用户字段值,或者在第一次身份验证期间提示用户输入,具体取决于您从服务中获得的数据类型.