2015-03-12 5 views
6

Im пытается разделить сервер ресурсов с сервера авторизации весной-загрузкой. У меня есть два разных приложения, которые я запускаю отдельно. На сервере авторизации я могу получить токен-носитель из oauth/token, но когда я пытаюсь получить доступ к ресурсу (отправляя токен в заголовке), я получаю недопустимую ошибку токена. Мое намерение - использовать InMemoryTokenStore и токен-носитель. Может ли кто-нибудь сказать мне, что не так в моем коде?Spring-boot oauth2 сервер авторизации расщепления и сервер ресурсов

Авторизация сервера:

@SpringBootApplication 
public class AuthorizationServer extends WebMvcConfigurerAdapter { 

    public static void main(String[] args) { 
    SpringApplication.run(AuthorizationServer.class, args); 
    } 

    @Configuration 
    @EnableAuthorizationServer 
    protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter { 

    private TokenStore tokenStore = new InMemoryTokenStore(); 

    @Autowired 
    private AuthenticationManager authenticationManager; 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
     endpoints 
     .authenticationManager(authenticationManager) 
     .tokenStore(tokenStore); 
    } 

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { 
     security.checkTokenAccess("hasAuthority('ROLE_USER')"); 
    } 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients 
      .inMemory() 
      .withClient("user") 
      .secret("password") 
      .authorities("ROLE_USER") 
      .authorizedGrantTypes("password") 
      .scopes("read", "write") 
      .accessTokenValiditySeconds(1800); 
    } 
} 

ресурсов сервера:

@SpringBootApplication 
@RestController 
@EnableOAuth2Resource 
@EnableWebSecurity 
@Configuration 
public class ResourceServer extends WebSecurityConfigurerAdapter { 



public static void main(String[] args){ 
    SpringApplication.run(ResourceServer.class, args); 
} 

@RequestMapping("/") 
public String home(){ 
    return "Hello Resource World!"; 
} 

@Bean 
public ResourceServerTokenServices tokenService() { 
    RemoteTokenServices tokenServices = new RemoteTokenServices(); 
    tokenServices.setClientId("user"); 
    tokenServices.setClientSecret("password"); 
    tokenServices.setTokenName("tokenName"); 
    tokenServices.setCheckTokenEndpointUrl("http://localhost:8080/oauth/check_token"); 
    return tokenServices; 
} 

@Override 
public AuthenticationManager authenticationManagerBean() throws Exception { 
    OAuth2AuthenticationManager authenticationManager = new OAuth2AuthenticationManager(); 
    authenticationManager.setTokenServices(tokenService()); 
    return authenticationManager; 
} 

@Configuration 
@EnableResourceServer 
protected static class ResourceServerConfig extends ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
      .requestMatchers() 
      .antMatchers("/","/home") 
      .and() 
      .authorizeRequests() 
      .anyRequest().access("#oauth2.hasScope('read')"); 
    } 

    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
     TokenStore tokenStore = new InMemoryTokenStore(); 
     resources.resourceId("Resource Server"); 
     resources.tokenStore(tokenStore); 
    } 
} 
+1

Привет, Я также пытаюсь сделать то же самое, не могли бы вы предоставить мне ссылки, которые вы следите/следовали за настройкой проекта. –

ответ

6

Вы создали 2 экземпляра InMemoryTokenStore. Если вы хотите делиться токенами между сервером auth и сервером ресурсов, им нужен тот же магазин.

+0

Спасибо Дэйв! – thomasso

+1

@Dave Syer - Значит, мне не нужно создавать экземпляр InmemoryTokenStore на моем сервере ресурсов? –

+0

Нет, это не помогло бы вообще (все жетоны хранятся в другом месте)? –

Смежные вопросы