Как создать client-id и client-secret в Spring-Boot и сохранить в базе данных? - PullRequest
1 голос
/ 22 октября 2019

Я знаю, что подобные вопросы уже существуют в stackoverflow. Когда я их просмотрел, это не решило проблему, которую я искал.

У меня есть подпружиненный веб-сервис как Oaut2ClientManagement, в котором ясоздание API, который в основном зарегистрирует нового клиента. Когда новая компания регистрируется, companyId (она предопределена в некоторой таблице company_details, да, компания добавлена ​​в список, но не зарегистрирована для доступа к API) отправляется так, исходя из того, что мне нужно сгенерировать client-id& client-secret, который я буду хранить в таблице CLIENT_KEY_MANAGEMENT. Исходя из этого, я пишу Java-код для генерации accessToken.

Так что мой вопрос здесь заключается в том, как я могу сгенерировать client-id & client-secret на основеcompanyId Я получил в запросе? Я прошел через этот ответ . Но есть ли в spring-boot oauth какой-либо заранее определенный способ, который может выполнять эту работу? Следующим шагом будет создание токена доступа на его основе.

Я также прошел oAuth учебник . Но при этом client-id & client-secret хранятся в файле свойств, а не в базе данных / другом источнике. Также кажется, что это одна пара.

Было бы замечательно, если бы кто-нибудь помог мне достичь вышеуказанного сценария, используя spring-boot.

1 Ответ

2 голосов
/ 22 октября 2019

Для этой конкретной цели есть JdbcClientDetailsService.

Вам необходимо определить следующую таблицу в вашей базе данных

create table oauth_client_details (
  client_id VARCHAR(256) PRIMARY KEY,
  resource_ids VARCHAR(256),
  client_secret VARCHAR(256),
  scope VARCHAR(256),
  authorized_grant_types VARCHAR(256),
  web_server_redirect_uri VARCHAR(256),
  authorities VARCHAR(256),
  access_token_validity INTEGER,
  refresh_token_validity INTEGER,
  additional_information VARCHAR(4096),
  autoapprove VARCHAR(256)
);

и настроить сервер авторизации Oauth2 следующим образом

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

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

}

И, наконец, вы можете внедрить компонент JdbcClientDetailsService в местоположение, в котором вы регистрируете companyId.

@Autowired
JdbcClientDetailsService jdbcClientDetailsService;

...
BaseClientDetails clientDetails = new BaseClientDetails(companyId, resourceIds, scopes, grantTypes, authorities);
clientDetails.setClientSecret("generatedpassword");
jdbcClientDetailsService.addClientDetails(clientDetails);

Наконец, вы можете войти в систему, используя эти учетные данные клиента.

ОБНОВЛЕНИЕ

Если вы хотите, чтобы ваши пароли хешировались, вы можете установить PasswordEncoder, как показано ниже.

clients.jdbc(dataSource)
                .passwordEncoder(new BCryptPasswordEncoder())

BaseClientDetails доступно в пакете org.springframework.security.oauth2.provider.client.

Секрет клиента не будет сгенерирован службой. Вам нужно сгенерировать его и установить BaseClientDetails.

...