Начало работы с REST
В этом разделе представлен пример получения через REST API информации о пользователях приложения.
Для начала добавьте REST в свой проект как описано в разделе Установка.
Получение токена доступа
Для доступа к защищенному ресурсу клиент должен предоставить действующий токен доступа. Спецификация OAuth 2.1 предоставляет несколько способов получения токена от сервера авторизации. Они называются типами разрешения (grant types). В этом примере мы будем использовать тип разрешения Client Credentials, который подходит для конфиденциальных клиентов, таких как бэкенд-интеграции.
Идея заключается в том, что в приложении Jmix мы должны зарегистрировать клиента (например, внешнее приложение, которому необходим доступ к Jmix REST API), определить идентификатор и секрет клиента, а затем, используя эти учетные данные, мы сможем получить токен доступа с помощью специального HTTP-запроса.
Функциональность, ответственная за выдачу токенов и поддержку всех функций протоколов OAuth 2.1 и OpenID Connect 1.0, предоставляется дополнением Authorization Server, которое должно уже быть включено во время установки дополнения REST API (io.jmix.authserver:jmix-authserver-starter
). Дополнение Authorization Server построено на основе Spring Authorization Server.
Простейший способ зарегистрировать клиента - добавить стандартные свойства Spring Authorization Server:
# The client id is my-client
spring.security.oauth2.authorizationserver.client.myclient.registration.client-id=my-client
# The client secret (password) is my-secret
spring.security.oauth2.authorizationserver.client.myclient.registration.client-secret={noop}my-secret
# Enable Client Credential grant for the my-client
spring.security.oauth2.authorizationserver.client.myclient.registration.authorization-grant-types=client_credentials
# Client credentials must be passed in the Authorization header using the HTTP Basic authentication scheme
spring.security.oauth2.authorizationserver.client.myclient.registration.client-authentication_methods=client_secret_basic
# Use opaque tokens instead of JWT
spring.security.oauth2.authorizationserver.client.myclient.token.access-token-format=reference
# access token time-to-live
spring.security.oauth2.authorizationserver.client.myclient.token.access-token-time-to-live=24h
Следующий набор свойств приложения специфичен для Jmix и определяет, какие ресурсные роли и роли уровня строк должны быть назначены токену, выданному клиенту. В данном примере мы назначим две ресурсные роли:
-
rest-minimal
(REST: minimal access) - чтобы разрешить доступ к REST API. -
user-management
(User management) - чтобы разрешить операции с сущностью User через REST API.
# my-client is the client id we configured previously
jmix.authserver.client.myclient.client-id = my-client
jmix.authserver.client.myclient.resource-roles = user-management, rest-minimal
Роль user-management
выглядит следующим образом:
@ResourceRole(name = "User management", code = UserManagementRole.CODE, scope = "API") (1)
public interface UserManagementRole {
String CODE = "user-management";
@EntityAttributePolicy(entityClass = User.class, attributes = "*", action = EntityAttributePolicyAction.MODIFY)
@EntityPolicy(entityClass = User.class, actions = EntityPolicyAction.ALL)
void user();
}
1 | "API" scope указывает, что роль будет применяться для запросов к REST API. |
После того как эти свойства заданы в приложении, должна появиться возможность получить токены доступа.
В данном примере для взаимодействия с REST API мы будем использовать инструмент командной строки curl
.
curl -X POST http://localhost:8080/oauth2/token \
--basic --user my-client:my-secret \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials"
В Windows удалите символы \ и вводите команду одной строкой.
|
Вы должны получить ответ подобный этому:
{
"access_token":"hKhgNyGMTqaKd6prH-GoHF8zFVTSr9tKKyE3OnMoafRO4FT4Xq_cewHr28cIRITaRmF0olRXpVTyFdxcOPTAl8Vc7xopHrdNuXNXwEeBn7NSiEMvQXW5zO0dwMn_H8FQ",
"token_type":"Bearer",
"expires_in":299
}
Атрибут access_token
— это токен, который можно использовать для дальнейших запросов в заголовке Authorization
. Он действует как временные учетные данные, которые предоставляют вам доступ к приложению от имени пользователя.
Запрос списка сущностей
С токеном доступа вы можете использовать операции (endpoints) REST API для загрузки списка пользователей. Замените <access_token>
значением, полученным на предыдущем шаге. Мы извлечем всех пользователей в приложении через Entities API:
curl -X GET http://localhost:8080/rest/entities/User \
-H "Authorization: Bearer <access_token>"
Ответ будет содержать всех пользователей, доступных в приложении:
[
{
"_entityName": "User",
"_instanceName": "[admin]",
"id": "60885987-1b61-4247-94c7-dff348347f93",
"version": 1,
"active": true,
"username": "admin"
}
]