Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 存储oauth和本地身份验证方法的最佳实践?_Mysql_Facebook_Twitter Oauth_Oauth 2.0 - Fatal编程技术网

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

Mysql 存储oauth和本地身份验证方法的最佳实践?,mysql,facebook,twitter-oauth,oauth-2.0,Mysql,Facebook,Twitter Oauth,Oauth 2.0,如果我运行一个允许用户通过“本地”用户名/密码组合以及任意数量的OAuth服务进行身份验证的服务,那么该用户数据模型会是什么样子 通常,如果我自己处理所有登录,在“用户”数据库(假设为MySQL)中,用户名和密码字段必须为非空。但是,如果我的用户只是想登录Facebook,我只会存储Facebook自动令牌,而不会在本地拥有任何用户名/密码 此外,如果他们想使用Twitter creds登录,然后是tumblr,然后是当天的任何服务,该怎么办?我可以为每种类型保留一个字段,但这可能会有点笨拙。如

如果我运行一个允许用户通过“本地”用户名/密码组合以及任意数量的OAuth服务进行身份验证的服务,那么该用户数据模型会是什么样子

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

此外,如果他们想使用Twitter creds登录,然后是tumblr,然后是当天的任何服务,该怎么办?我可以为每种类型保留一个字段,但这可能会有点笨拙。如果没有更好的术语,我是否最好保留另一个“身份验证方法”表,这样我就可以在用户之间建立一对多的关系,以及如何对他们进行身份验证

基本上,我想问的是,是否有人知道这个场景的行业标准最佳实践,或者是否可以为我指出正确的方向(或者是否有人已经实现了这样一个对他们来说很好的方法)。一个用户,多种身份验证方法-保存该信息的最佳方式是什么


如果我所做的任何假设都是无效的,我很抱歉,请纠正我。

我不知道我的解决方案是否接近任何行业标准,但我以前在多个应用程序中都这样做过

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

User table:
id int
username varchar
email varchar
password varchar

Authentication profile table:
user_id int
service enum('website','google','facebook')
token varchar
[为了进一步规范化,使用服务元字段将服务设置为自己的表。]

然后,您的auth脚本执行如下操作:

User table:
id int
username varchar
email varchar
password varchar

Authentication profile table:
user_id int
service enum('website','google','facebook')
token varchar
  • 查找用户名/电子邮件
  • 识别已知的身份验证配置文件
  • 查看输入是否验证任何已知的身份验证配置文件和身份验证,或返回无效凭据

  • 对于某些服务,您可能需要自动生成某些用户字段值,或者在第一次身份验证期间提示用户输入,具体取决于服务提供给您的数据类型

    我认为您需要的是一个本地身份验证系统(可能是因为遗留原因?)以及对使用委托身份验证登录的用户的支持。授权的标准是。您可能想看看,这会让您了解如何存储OpenID凭据。不幸的是,Facebook和Twitter不支持OpenID,但流量基本相同,即您的数据模型不会改变。我们已经实现了一个OpenID使用者来支持基于OpenID的登录和注册。为了支持本地身份验证,我们使用了OpenID提供程序。换句话说,我们既是消费者又是提供者。这样,即使是本地身份验证系统也是基于标准的。现在回答您关于模式的问题-我们在身份验证表中有源(本地、twitter、facebook、google、yahoo、AOL)和电子邮件作为复合密钥,以及令牌和/或密码。我们允许用户更改他们的显示名称,并且有一个唯一的虚荣URL,它也是这个模式的一部分。当用户通过OpenID进入时,他们可以选择设置密码,因为对于移动设备,他们需要密码(移动设备上不太支持OpenID)。OAuth解决了一个稍有不同的用例,您处理的是授权而不是身份验证。这有用吗?如果您有任何问题,请随时发表评论,我很乐意提供更多的细节-我只是不想在这一点上用太多的信息来迷惑您

    就我个人而言,我不想处理超过一个或两个身份验证方案——尝试接受任何一个方案和所有方案都将是一场噩梦。如果你的应用程序与FB关系更密切,那么允许FB,等等。。。就OAuth+local而言,我认为您应该在用户类上实现一个方法,比如oauthenticated?(我是一个喜欢ruby的人),这会告诉你他们最初是本地授权的还是o-authed的。然后,在您的身份验证代码中,您需要检查并根据他们用来让他们登录的方法进行分支。在那之后,这就不重要了。这和我希望的样子很相似。在用户表中还可能有一个默认的_配置文件,以便用户只需点击/登录,它就知道要做什么,或者需要一个参数来指定要执行的登录类型。所以auth_type=facebook不需要任何其他东西,我只需要使用存储的令牌,但是auth_type=website需要登录名和密码。听起来可行吗?(什么…评论中没有换行?)是的,或者在facebook的情况下,你可以在用户到达页面时轮询FB.Auth事件并自动登录。当用户重新登录时,应用程序如何知道此人以前是否登录过?基本上,我不明白在我使用facebook登录一次,然后使用Google第二次登录之后,如何确定id整数。我的应用程序会考虑这两个不同的用户吗?还是一个用户?重申一下,应用程序如何知道这两个登录是同一个人(除了任何类型的cookie)。只是一个建议,在OpenID Connect中,允许用户登录的实体称为提供者(OPs-OpenID Connect Providers),以及希望请求用户登录提供者的实体,即StackOverflow、Spotify、Netflix,这些被称为服务。以良好命名法的名义,我建议对您的示例进行更新,即在“身份验证配置文件表”一节中:要通过provider.Ya更改服务,整个oauth与openid的事情都非常混乱。如果你去facebook的认证页面,它没有提到openid,只是oauth。那么…必须同时支持这两个吗?(假设我需要支持facebook)OAuth可以用作OpenID的子集,因为您混合了身份提供者和资源提供者。我可以告诉你我们在做什么——我们在处理facebook和Twitter