我正在尝试了解OAuth 2的工作原理。 我不明白这一点:如果Authorization Server和Resource Server不是同一个系统,如下图所示:
资源服务器如何知道谁是用户以及他的权限是什么? 我可以从访问令牌中检索这些信息,还是必须在授权服务器和资源服务器之间进行后端通信?
答案 0 :(得分:2)
取决于令牌的类型,了解资源服务器如何使用它。
自编码访问令牌令牌(例如JWT承载令牌)将包含令牌中的所有用户和范围信息。或者一些Auth系统使用令牌内省,详见Jan的答案。
This is a good introduction到资源服务器和令牌类型。
一个非常常见的自编码标记是JWT Token。
以自编码访问令牌为例:
访问令牌将包含上述示例中发出的令牌的用户标识符和范围/权限 - 这是“隐式”授权类型。
资源服务器不需要联系auth服务器。这可能是Oauth 2.0 for API的主要优势之一。它必须相信它。它应确认令牌已由auth服务器签名,并且如果由auth服务器加密,它可能还需要能够解密令牌。
显然,资源服务器需要能够访问令牌中的用户数据。可能是auth服务器和资源服务器指向相同的底层数据库。
答案 1 :(得分:2)
访问令牌通常是随机生成的字符串,因此您无法从中读取任何信息(但可能存在使用某些有意义值的OAuth2实现)。资源服务器must validate访问令牌及其范围,而不是在创建令牌(资源所有者)之前经过身份验证的用户的权限。这是一个重要的细节,因为OAuth2是一种协议,用于以访问令牌及其范围的形式从资源所有者到客户端的权限委派。为此,资源服务器需要向auth服务器的Token Introspection端点发出HTTP请求。 JSON response包含
active
,表示访问令牌是否仍然有效(不是撤销,未过期)scope
保存资源所有者username
资源所有者资源服务器应检查访问令牌是否处于活动状态,并且它包含所请求资源或服务所需的范围。它可以执行一些其他验证(例如,请求的资源由username
字段标识的资源所有者拥有)。
资源服务器可以缓存给定访问令牌的内省响应(以提高性能)。请参阅RFC security considerations。
访问令牌可以以可验证的方式自包含授权信息(例如签名的JWT)。在这种情况下,资源服务器应该能够在不调用auth服务器的情况下验证令牌的真实性(签名)和范围,但是由于资源服务器甚至会接受令牌,因此很难实现token revoke endpoint。如果它在auth服务器上被撤销。
答案 2 :(得分:0)
这可能很复杂。用户,应用程序和资源之间存在许多不同的实现和组合关系。
对您的体系结构和相关实体之间的关系进行更具描述性的解释可能会有所帮助。
如果您尝试识别用户,请OAuth is not the correct protocol。你应该调查OpenID Connect或User-Managed Access。
通常,资源服务器只需知道范围即可提供访问权限。不是用户的身份。
-Jim