为什么我的令牌被拒绝?什么是资源 ID?“无效的令牌不包含资源 ID (oauth2-resource)”
2022-09-02 19:49:50
我正在尝试为春季项目配置OAuth2。我使用的是工作场所提供的共享UAA(来自云铸造厂的oauth实现)实例(所以我没有尝试创建授权服务器,并且授权服务器与资源服务器是分开的)。前端是一个单页应用程序,它使用隐式授权直接从授权服务器获取令牌。我有SPA设置,它将每个Web API调用的标头添加到微服务。Authorization: Bearer <TOKEN>
我的问题现在与微服务有关。
我正在尝试使用此共享授权服务器对微服务进行身份验证。我可能在这里有一个误解,购买我目前的理解是,这些微服务扮演资源服务器的角色,因为它们托管SPA用于获取数据的端点。
所以我尝试像这样配置微服务:
@Configuration
@EnableResourceServer
public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/**").authenticated();
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setVerifierKey("-----BEGIN PUBLIC KEY-----<key omitted>-----END PUBLIC KEY-----");
return converter;
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
return defaultTokenServices;
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenServices(tokenServices());
}
}
现在,每当我用 ,击中 a 时,我都会得到一个,并显示此错误:/api/**
Authorization: Bearer <TOKEN>
403
{
"error": "access_denied",
"error_description": "Invalid token does not contain resource id (oauth2-resource)"
}
所以这是我的问题:
-
如何配置这些微服务以验证令牌并在控制器方法中插入
主体
?我目前已在SPA具有并发送令牌的位置进行了设置,并且我还具有用于验证令牌签名的公钥。我还使用 jwt.io 来测试令牌,它显示“签名已验证”。 - 什么是资源 ID?为什么我需要它,为什么它会导致上述错误?那是春天唯一的事情吗??
谢谢!