我正在尝试为 spring 项目配置 OAuth2。我正在使用我的工作场所提供的共享 UAA( 来自 cloud foundry 的 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());
}
}
现在,每当我用 /api/**
Authorization: Bearer <TOKEN>
时,我都会得到 403
并出现此错误:
{
"error": "access_denied",
"error_description": "Invalid token does not contain resource id (oauth2-resource)"
}
所以这是我的问题:
- 如何配置这些微服务以验证令牌并在控制器方法中插入
Principal
? 我目前在 SPA 拥有并发送令牌的地方设置它,我还有用于验证令牌签名的公钥。我还使用 jwt.io 来测试令牌,它显示“签名已验证”。 - 什么是资源ID?为什么我需要它,为什么会导致上面的错误?那是春天唯一的事情吗?
谢谢!
原文由 Rico Kahler 发布,翻译遵循 CC BY-SA 4.0 许可协议
Spring OAuth 期望 JWT 令牌中的“aud” 声明。该声明的值应与您指定 Spring 应用程序的
resourceId
值匹配(如果未指定,则默认为“oauth2-resource”)。要解决您的问题,您需要:
登录您的共享 UAA 并确保它包含“aud”声明。
将该“aud”声明的值更改为“oauth2-resource”,或者最好在您的 Spring 应用程序更新中
resourceId
更改为该声明的值,如下所示: