我已经使用spring-boot和编写了一个简单的 REST API 后端Spring REST。端点将由各种第三方应用程序使用并按预期工作。
现在我想使用 spring security 和 OAUTH 2.0 来保护这些端点。
我计划使用外部OAuth 2.0授权服务器,这样我的rest-api-backend(spring-boot 应用程序)将充当资源服务器并通过调用外部授权服务器的令牌自省端点来验证访问令牌。
每当客户端应用程序api-end-points使用授权标头中的访问令牌(使用机器到机器流中的client_credentials 授权类型从外部 authz 服务器获得的不透明承载令牌)调用 my 时,Spring 总是抛出以下错误:
{
"error": "access_denied",
"error_description": "Invalid token does not contain resource id (oauth2-resource)"
}
Run Code Online (Sandbox Code Playgroud)
经过一番研究,通过将调用应用程序的客户端 ID 设置为资源 ID 以如下方式解决了该问题:
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenServices(tokenService());
resources.resourceId("5ght-6117-fdc6-8787-9017-20c784a9c03a");
// super.configure(resources);
}
Run Code Online (Sandbox Code Playgroud)
Spring 似乎aud根据资源 ID 中设置的值验证了令牌自省响应中的声明。
我无法完全理解这一点,为什么 Spring 会这样做?
作为资源服务器,它应该简单地检查访问令牌是否有效,是否具有正确的范围等。
Spring 是否维护了允许客户端的白名单?
就我而言,有多个客户端应用程序将访问rest-api-backend …