Spring-boot oauth2 разделение сервера авторизации и сервера ресурсов

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

Сервер авторизации:

@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);
    }
}

person thomasso    schedule 12.03.2015    source источник
comment
Привет, я тоже пытаюсь сделать то же самое, не могли бы вы предоставить мне ссылки, за которыми вы следите / следуете для настройки проекта   -  person karthik pamidimarri    schedule 02.07.2015


Ответы (1)


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

person Dave Syer    schedule 12.03.2015
comment
@Dave Syer - Значит, мне не нужно создавать экземпляр InmemoryTokenStore на моем сервере ресурсов? - person Suleman khan; 28.08.2015
comment
Нет, это вообще не поможет (все токены хранятся в другом месте)? - person Dave Syer; 08.09.2015
comment
@DaveSyer Можно ли этого добиться, но вместо разделения 2 серверов на 2 приложения. Сделать все это в одном приложении и иметь учетные данные в файле app.properties? - person Jesse; 28.03.2017
comment
@DaveSyer, Правильно ли настроить clientId/secret для сервера ресурсов, чтобы запрашивать информацию о пользователе с сервера oauth, передав токен (в этом случае доступ к хранилищу db не требуется)? - person Sergii; 25.03.2020