从0开始构建一个Oauth2Server服务 24
资源服务器 resource-server
资源服务器是 API 服务器的 OAuth 2.0 术语。资源服务器在应用程序获得访问令牌后处理经过身份验证的请求。
大规模部署可能有多个资源服务器。例如,谷歌的服务有几十个资源服务器,如谷歌云平台、谷歌地图、谷歌云端硬盘、Youtube、谷歌+等。这些资源服务器中的每一个都是明显独立的,但它们都共享同一个授权服务器。
较小的部署通常只有一个资源服务器,并且通常构建为与授权服务器相同的代码库或相同部署的一部分。
验证访问令牌
资源服务器将从带有包含访问令牌的 HTTP 标头的应用程序获取请求Authorization
。资源服务器需要能够验证access token来决定是否处理请求,找到关联的用户账号等。
如果您使用的是JWT,那么验证令牌可以完全在资源服务器中完成,而无需与数据库或外部服务器交互。
如果您的令牌存储在数据库中,那么验证令牌只是在令牌表上进行数据库查找。
另一种选择是使用Token Introspection规范来构建 API 来验证访问令牌。这是处理跨大量资源服务器验证访问令牌的好方法,因为这意味着您可以将访问令牌的所有逻辑封装在单个服务器中,通过 API 将信息公开给系统的其他部分。令牌内省端点仅供内部使用,因此您需要使用一些内部授权来保护它,或者只在系统防火墙内的服务器上启用它。
验证范围 scope
资源服务器需要知道与访问令牌关联的范围列表。如果访问令牌中的范围不包括执行指定操作所需的范围,则服务器负责拒绝请求。
OAuth 2.0 规范本身没有定义任何范围。范围列表由服务自行决定。
过期令牌
如果您的服务使用短期访问令牌和长期刷新令牌,那么您需要确保在应用程序使用过期令牌发出请求时返回正确的错误响应。
返回带有标头的 HTTP 401 响应,WWW-Authenticate
如下所述。如果您的 API 通常返回 JSON 响应,那么您也可以返回具有相同错误信息的 JSON 正文。
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer error="invalid_token"
error_description="The access token expired"
Content-type: application/json
{
"error": "invalid_token",
"error_description": "The access token expired"
}
这将向客户表明他们现有的访问令牌已过期,他们应该尝试使用他们的刷新令牌获取一个新的访问令牌。
错误代码和未经授权的访问
如果访问令牌不允许访问所请求的资源,或者如果请求中没有访问令牌,则服务器必须使用 HTTP 401 响应进行回复,并在响应中包含一个标头WWW-Authenticate
。
最小WWW-Authenticate
标头包含字符串Bearer
,表示需要不记名令牌。标头还可以指示其他信息,例如“领域”和“范围”。“领域”值用于传统的HTTP 身份验证意义上。“scope”值允许资源服务器指示访问资源所需的范围列表,因此应用程序可以在启动授权流程时向用户请求适当的范围。根据发生的错误类型,响应还应包括适当的“错误”值。
invalid_request
(HTTP 400) – 请求缺少参数,或者格式不正确。invalid_token
(HTTP 401) – 访问令牌已过期、撤销、格式错误或由于其他原因无效。客户端可以获取新的访问令牌并重试。insufficient_scope
(HTTP 403) – 访问令牌
例如:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
scope="delete",
error="insufficient_scope"
如果请求没有身份验证,则不需要错误代码或其他错误信息。
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example"