Предоставить доступ к серверу ресурсов с помощью токенов, сгенерированных ключом и секретным ключом сервера ресурсов - Spring boot - PullRequest
0 голосов
/ 25 января 2020

У меня есть AuthorizationServer и ResourceServer, настроенные с помощью Spring-Boot, я зарегистрировал двух фиктивных клиентов, используя уникальный идентификатор клиента и секретный ключ в таблицах oauth_client_details. Я настроил один из этих клиентов в ResourceServer, предоставив идентификатор клиента и client-secret. Затем я сгенерировал токен, используя другой ключ и секрет, и отправил запрос API с токеном носителя, и он вернул успех, который не является ожидаемым. Мне нужно разрешить отправлять запрос с токенами, сгенерированными клиентским ключом приложения и секретом. Не удалось найти что-нибудь в inte rnet по этому поводу, ваша помощь приветствуется.

Ниже приведен код для сервера авторизации

@Configuration
public class AuthorizationServerConfiguration implements AuthorizationServerConfigurer {

    @Autowired
    private PasswordEncoder passwordEncoder;
    @Autowired
    private DataSource dataSource;
    @Autowired
    private AuthenticationManager authenticationManager;


    @Bean
    TokenStore jdbcTokenStore() {
        return new JdbcTokenStore(dataSource);
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.checkTokenAccess("isAuthenticated()").tokenKeyAccess("permitAll()");

    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource).passwordEncoder(passwordEncoder);

    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(jdbcTokenStore());
        endpoints.authenticationManager(authenticationManager);
    }
}
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    protected AuthenticationManager getAuthenticationManager() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }
}

На сервере ресурсов, который я включил @EnableResourceServer и добавил соответствующие конфиги безопасности в файле application.yml

security:
  oauth2:
    resource:
      token-info-uri: http://localhost:9191/oauth/check_token
    client:
      client-id: mobile
      client-secret: pin

Обратите внимание, что я сгенерировал токен, используя другой зарегистрированный клиентский ключ и секрет, но все же могу успешно вызвать вышеуказанный сервер ресурсов, используя этот знак.

Спасибо, Раджит

1 Ответ

0 голосов
/ 26 января 2020

После дня серфинга по Google я обнаружил, что мы можем использовать resourceId для удовлетворения вышеописанного сценария.

  • Зарегистрировать клиента (сохранить ключ клиента, секрет в oauth_client_details с идентификатором ресурса или несколькими идентификаторами ресурса)
  • Создать токен с использованием зарегистрированного ключа клиента и секрета, это токен содержит поле «aud», которое представляет идентификатор ресурса, который мы сохранили в базе данных.
  • Ниже приведен ответ check_token, возвращаемый сгенерированным токеном

, например:

{
  "aud": [
    "mobile",
    "web",
  ],
  "user_name": "user1",
  "scope": [
    "READ"
  ],
  "active": true,
  "language": "ENGLISH",
  "exp": 1580028351,
  "client_id": "client_1"
}
  • Теперь в ResourceServer вам нужно проверить, что предоставленный токен содержит этот идентификатор ресурса. Посмотрите приведенный ниже пример кода, он проверяет, имеет ли предоставленный токен на предъявителя аудит с мобильным телефоном, в противном случае запрос будет запрещен.
@Configuration
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    private static final String RESOURCE_ID = "mobile";

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

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.resourceId(RESOURCE_ID);
    }

}

Все, ребята, пожалуйста, дайте мне знать, если вы можете добавить больше к этому. Спасибо @Tommas Andolf за разъяснения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...