Отвечает за авторизацию и аутентификацию клиентов и api(тоже выступает клиентом), хранит информацию, необходимую для авторизации пользователя, а также список их привелегий
- Поддержка регистрации (login + password)
- Поддержка логина(login + password)
- Поддержка логина и регистрации через сторонние апи по OAuth2.0 (google, vk и тп)
- Авторизация через jwt токены
- Jwt токены должны быть «обновляемыми», то есть должна быть поддержка refresh token’ов
- Пароли должны храниться в зашифрованном виде в базе данных
Для обращения к закрытому api сервиса нужно обращаться к нему в качестве OAuth клиента. В качестве клиента может выступать другой сервис или приложение. Пользователи приложений обращаются к нему под учетной записью клиента. На текущий момент клиенты заводятся руками разработчиками напрямую через БД. Credentials клиента передаются в заголовке запроса Authorization в формате Basic Auth.
Выходные данные в формате application/json:
- access_token = jwt токен доступа
- refresh_token = токен для обновления access_token
- token_type = Тип access_token (Bearer)
- expires_in = Время до истечения токена в секундах
Входные данные различаются в зависимости от переданного grant_type.
Через данный grant_type осуществляется обмен токена из сторонней системы на токен для Random Walk API
Принимает:
- Credentials клиента в заголовке Authorization в формате Basic Auth
- Тело запроса в формате application/x-www-form-urlencoded:
- grant_type (required) = urn:ietf:params:oauth:grant-type:token-exchange
- subject_token (required) = Токен доступа из стороннего источника
- subject_token_type (required) = Тип токена (На текущий момент поддерживается только Access Token)
- subject_token_provider (required) = Название платформы в lowercase, которой пренадлежит предоставляемый токен доступа (google, yandex, etc.)
Через данный grant_type происходит обновление токена доступа через refresh_token
Принимает:
- Credentials клиента в заголовке Authorization в формате Basic Auth
- Тело запроса в формате application/x-www-form-urlencoded:
- grant_type (required) = refresh_token
- refresh_token (required) = значение полученного ранее refresh_token
Прежде чем запрашивать токен доступа пользователь должен получить одноразовый пароль.
Сделать это можно воспользовавшись ручкой POST /email/otp передав в теле запроса email пользователя, на который должен прийти одноразовый пароль.
Через данный grant_type можно получить токен доступа, обменяв на него одноразовый пароль
Принимает:
- Credentials клиента в заголовке Authorization в формате Basic Auth
- Тело запроса в формате application/x-www-form-urlencoded:
- grant_type (required) = email_otp
- email (required) = email, на который должен был прийти одноразовый пароль
- otp (required) = одноразовый пароль
Получить метаданные сервера авторизации. Список урл ручек из стандарта OAuth и поддерживаемых grant_type Пример ответа:
{
"issuer": "https://issuer-url.com/auth", # url of issuer
"token_endpoint": "https://issuer-url.com/auth/token", # url of token endpoint
"jwks_uri": "https://issuer-url.com/auth/jwks", # url of jwk information endpoint
"grant_types_supported": [ # supported grant types
"urn:ietf:params:oauth:grant-type:token-exchange",
"refresh_token"
],
"response_types_supported": [ # supported response types
"token"
]
}
Получить информацию о JWK публичного ключа. Используется ресурсными серверами для получения публичного ключа для валидации получаемых jwt токенов
Для того чтобы твой сервер стал ресурсным в Random Walk API тебе нужно:
- Добавить в проект библиотеку
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' - В property проекта добавить issuer_uri для ресурсного сервиса:
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://place-auth-service-issuer-uri-here
- В свой securityConfig добавить поддержку ресурсного сервера и отключить поддержку сессий (так как авторизация через jwt токены), если они не нужны самому приложению:
.sessionManagement(configurer ->
configurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.oauth2ResourceServer(oauth2 ->
oauth2.jwt(jwt -> jwt
.jwtAuthenticationConverter(jwtAuthenticationConverter()))
);
- Настроить конвертер jwt, для получения GrantedAuthority авторизированного пользователя в свой сервис, чтобы они использовались в @PreAuthorize аннотации
@Bean
public JwtAuthenticationConverter jwtAuthenticationConverter() {
JwtAuthenticationConverter converter = new JwtAuthenticationConverter();
converter.setJwtGrantedAuthoritiesConverter(
jwt -> {
List<String> list = jwt.getClaimAsStringList("authorities");
return list.stream()
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toSet());
}
);
return converter;
}
