OAuth 2.0资源所有者访问令牌实现

时间:2015-05-06 19:14:24

标签: php authentication oauth oauth-2.0

我已阅读RFC6749了解OAuth 2.0以及相当多的SO问题和博文,但我仍不清楚如何实施某些内容。

目前,用户通过网页上的表单登录,并使用进行数据库调用的应用程序来获取和操作资源。目标是从应用程序中抽象出资源。

在OAuth 2.0的背景下,我发现了:

  • 用户资源所有者
  • 我的网络应用程序是客户端,特别是机密客户端
  • 我的API是资源服务器

我也理解OAuth 2.0的工作原理是授权授权和访问令牌(至少)。我想在我的授权服务器中支持密码和客户端凭据授权类型。让我们假设我的Web应用程序是唯一授权访问API的应用程序。

有关使用资源所有者授权授予类型实施的问题:

  1. 每个用户都会收到自己的访问令牌吗?我假设是的,因为我需要区分不同的用户以用于其他目的(例如授权)
  2. 用户可以收到多个访问令牌吗? (例如,如果他们以超过1个用户代理/计算机登录应用程序)
  3. 我将Authorization HTTP标头中的哪些内容发送到授权服务器? (记住我只有一个客户)
  4. 如何从访问令牌中获取用户的身份? (例如用户ID /用户名)
  5. 在Web应用程序的$_SESSION中存储访问令牌和刷新令牌是否安全?

1 个答案:

答案 0 :(得分:0)

我的整体评论是,您不应使用资源所有者密码凭据授予来实现您想要的但授权代码授权。这样您就可以独立于客户端(应用程序)升级您的身份验证方式,并实现SSO。

  1. 不是用户(资源所有者)接收访问令牌,而是客户端(您的Web应用程序)。在使用资源所有者密码授予或授权代码授予时,您的客户端会为每个用户收到访问令牌。使用客户端凭据授权时,获取访问令牌以在特权模式下为具有相同令牌的所有用户进行操作是最合乎逻辑的。

  2. 通常不是因为在OAuth 2.0中,用户无法登录该应用程序。除非使用资源所有者密码凭据流,否则他们会这样做。在这种情况下,应用程序应该注意到该用户存在现有的访问令牌,并且它不会请求新的用户。

  3. 这似乎会混淆Authorization标头中的访问令牌对资源服务器的使用,并对授权服务器验证客户端或资源所有者。在后一种情况下,不需要HTTP基本身份验证,这只是客户端/资源所有者身份验证的选项之一。

  4. 如果要对用户进行身份验证,则需要应用OpenID Connect,这是一种基于OAuth 2.0构建的用户身份验证协议。另见Q2中的上一个链接。如果您想要在之前的某个时刻向用户提供访问令牌的用户信息,那么您可以使用访问令牌来提供您提供该信息的API,或者您可以将其嵌入访问令牌中(例如,在JWT访问中)令牌)。

  5. 这是一种常见的处理方式,与PHP安装一样安全,请参阅:Security of $_SESSION array