Why is my token being rejected? What is a resource ID? "Invalid token does not contain resource id (oauth2-resource)"
Spring OAuth expects "aud" claim in JWT token. That claim's value should match to the resourceId
value you specify your Spring app (if not specified it defaults to "oauth2-resource").
To fix your issue you need to:
1) Log into your shared UAA and make sure it does include "aud" claim.
2) Change the value of that "aud" claim to be "oauth2-resource" or preferably in your Spring app update resourceId
to that claim's value like this:
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenServices(tokenServices());
resources.resourceId(value from the aud claim you got from UAA server);
}
I add a similar issue. In my case, I used jdbc authentification and my authorization server and resource server was two separate API.
Authentorization server
@Override public void configure(AuthorizationServerSecurityConfigurer oauthServer) { oauthServer.tokenKeyAccess("permitAll()") .checkTokenAccess("isAuthenticated()") .passwordEncoder(oauthClientPasswordEncoder);
}
/** * Define the client details service. The client may be define either as in memory or in database. * Here client with be fetch from the specify database */ @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.jdbc(dataSource); } /** * Define the authorization by providing authentificationManager * And the token enhancement */ @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) { endpoints.tokenStore(tokenStore()) .tokenEnhancer(getTokenEnhancer()) .authenticationManager(authenticationManager).userDetailsService(userDetailsService); }
Resource server
public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter { private TokenExtractor tokenExtractor = new BearerTokenExtractor(); @Autowired private DataSource dataSource; @Bean public TokenStore tokenStore() { return new JdbcTokenStore(dataSource); } @Override public void configure(HttpSecurity http) throws Exception { http.addFilterAfter(new OncePerRequestFilter() { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // We don't want to allow access to a resource with no token so clear // the security context in case it is actually an OAuth2Authentication if (tokenExtractor.extract(request) == null) { SecurityContextHolder.clearContext(); } filterChain.doFilter(request, response); } }, AbstractPreAuthenticatedProcessingFilter.class); http.csrf().disable(); http.authorizeRequests().anyRequest().authenticated(); } @Bean public AccessTokenConverter accessTokenConverter() { return new DefaultAccessTokenConverter(); } @Bean public RemoteTokenServices remoteTokenServices(final @Value("${auth.server.url}") String checkTokenUrl, final @Value("${auth.resource.server.clientId}") String clientId, final @Value("${auth.resource.server.clientsecret}") String clientSecret) { final RemoteTokenServices remoteTokenServices = new RemoteTokenServices(); remoteTokenServices.setCheckTokenEndpointUrl(checkTokenUrl); remoteTokenServices.setClientId(clientId); remoteTokenServices.setClientSecret(clientSecret); remoteTokenServices.setAccessTokenConverter(accessTokenConverter()); return remoteTokenServices; }
With this configuration, I was getting
{
"error": "access_denied",
"error_description": "Invalid token does not contain resource id
(xxxxx)"
}
To solve this, I had to add
private String resourceIds= "xxxxx". !! maked sure that this resourceids is store in oauth_client_details for the clientid I used to get the token
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId(resourceIds).tokenStore(tokenStore());
}