我已经阅读了有关OAuth 2.0的RFC6749,还有很多问题和博客文章,但我仍然不清楚如何实施某些事情。
当前,用户通过网页上的表单登录并使用该应用程序,该应用程序可以调用数据库调用以获取和操纵资源。目标是从应用程序中抽象资源。
在OAuth 2.0的背景下,我已经确定了:
- 用户是资源所有者
- 我的Web应用程序是客户端,特别是机密客户端
- 我的API是资源服务器
我还了解OAuth 2.0通过授权赠款和访问令牌(至少)工作。我想支持我的授权服务器中的密码和客户凭证授予类型。我们还假设我的Web应用程序是访问API的唯一授权应用程序。
有关使用资源所有者授权的实施问题的问题:
- 每个用户是否会收到自己的访问令牌?我假设是的,因为我需要区分不同的用户出于其他目的(例如授权)
- 用户可以接收多个访问令牌吗?(例如,如果他们以1个以上的用户代理/计算机登录到应用程序)
- 我在
Authorization
HTTP标头中将什么发送到授权服务器?(记住我只有一个客户) - 如何从访问令牌获得用户的身份?(例如用户ID/用户名)
- 在Web应用程序中将访问令牌存储在
$_SESSION
中是否安全?
我的总体评论是,您不应使用资源所有者密码凭据赠款来实现所需的目标,而是授权代码授予。这将使您能够独立于客户(应用程序)并实现SSO升级身份验证手段。
-
接收访问令牌不是用户(资源所有者),而是客户端(您的Web应用程序)。使用资源所有者密码授予或授权代码授予时,您的客户端会为每个用户接收访问令牌。使用客户凭证授予时,获得访问令牌是最合乎逻辑的
-
通常不是因为在OAuth 2.0中,用户不登录到应用程序。除非使用资源所有者密码凭据流,否则它们也是如此。在这种情况下,应用程序应注意该用户有现有的访问令牌,并且不会要求新的访问令。
-
似乎将
Authorization
标头中的访问令牌使用与资源服务器中的访问令使用,并通过对客户端或资源所有者的身份验证授权服务器进行身份验证。在后一种情况下,不需要HTTP基本身份验证,这只是客户/资源所有者身份验证的选项之一。 -
如果要对用户进行身份验证,则需要应用OpenID Connect,这是构建在OAuth 2.0顶部的用户身份验证协议。另请参见Q2中的先前链接。如果您需要有关向客户端提供访问令牌的信息的信息令牌)。
-
这是一种与您的PHP安装一样安全的常用方式,请参见:$ _Session Array的安全性