【发布时间】:2018-06-08 08:16:02
【问题描述】:
我正在尝试为 spring 项目配置 OAuth2。我正在使用我的工作场所提供的共享 UAA (oauth implementation from cloud foundry) 实例(因此我没有尝试创建授权服务器,并且授权服务器与资源服务器是分开的)。前端是一个单页应用程序,它使用隐式授权直接从授权服务器获取令牌。我有 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());
}
}
现在每当我用Authorization: Bearer <TOKEN> 击中/api/** 时,我都会收到带有此错误的403:
{
"error": "access_denied",
"error_description": "Invalid token does not contain resource id (oauth2-resource)"
}
所以这是我的问题:
-
如何配置这些微服务以验证令牌并在控制器方法中插入
Principal? 我目前已将其设置在 SPA 拥有并发送令牌的位置,并且我还拥有用于验证的公钥令牌的签名。我还使用jwt.io 测试了令牌,它显示“签名已验证”。 - 什么是资源 ID?为什么我需要它,为什么它会导致上述错误?那只是春天的事吗??
谢谢!
【问题讨论】:
标签: java spring oauth-2.0 jwt spring-security-oauth2