Неверный токен не содержит идентификатор ресурса (oauth2-ресурс) - PullRequest
0 голосов
/ 28 мая 2018

Я изучаю OAuth2 и у меня проблемы с настройкой гранта client_credentials.Вот некоторый пример клиент-сервер.

Клиентская сторона (8080):

@SpringBootApplication
@EnableOAuth2Client
public class ClientApplication {

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

    @Bean
    @ConfigurationProperties("security.oauth2.client")
    public ClientCredentialsResourceDetails oAuthDetails() {
        return new ClientCredentialsResourceDetails();
    }

    @Bean
    public OAuth2RestTemplate restTemplate() {
        return new OAuth2RestTemplate(oAuthDetails());
    }
}

@Configuration
public class ClientSecurity extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().permitAll();
    }
}

@Controller
public class ClientController {

    @Autowired
    private OAuth2RestTemplate template;

    @GetMapping("/getServer")
    public String get() {
        template.getForEntity("http://localhost:8081/endpoint", String.class);
        return "index.html";
    }
}

Серверная часть ресурса (8081):

@SpringBootApplication
@EnableResourceServer
public class ServerApplication {

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

@Configuration
public class ServerSecurity extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/actuator/**").permitAll();
    }
}

@RestController
public class ServerController {

    @GetMapping("/endpoint")
    public ResponseEntity<String> respond() {
        return new ResponseEntity<>("", HttpStatus.OK);
    }
}

Когда я нажимаю на клиентский /getServer, я получаю это исключение:

org.springframework.security.oauth2.client.resource.OAuth2AccessDeniedException: Invalid token does not contain resource id (oauth2-resource)

Если я удаляю ServerSecurity, ClientController работает без выброса исключения, но привод / работоспособность сервера не работает с 401.

Что может быть не так?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

yml клиента:

server:
  port: 8080

security:
  oauth2:
    client:
      grant-type: client_credentials
      clientId: __data__
      clientSecret: __data__
      accessTokenUri: https://dev-410899.oktapreview.com/oauth2/default/v1/token
      scope: web_app
    resource:
      id: oauth2-resource

yml сервера:

server:
  port: 8081

security:
  oauth2:
    client:
      clientId: __data__
      clientSecret: __data__
    resource:
      tokenInfoUri: https://dev-410899.oktapreview.com/oauth2/default/v1/introspect

1 Ответ

0 голосов
/ 29 мая 2018

Идентификатор сервера ресурсов OAuth2 по умолчанию - oauth2-resource.(отметьте ResourceServerSecurityConfigurer).Вы можете установить пользовательский идентификатор сервера ресурсов:

@Override
public void configure(ResourceServerSecurityConfigurer oauthServer) {
    oauthServer
            .resourceId("your resource id");
}

. При выдаче токена вы должны предоставить своему клиенту client_credentials доступ к правильному идентификатору сервера ресурсов.

...