ЕСОЗ - публічна документація
UA_Exchange oAuth Code Grant to Access Token
Мета
Цей WS призначений для обміну кодом авторизації із запитаними скоупами для токену доступу для користувача та клієнта.
Ключові положення
Даний метод має використовуватись тільки бек-енд частиною додатків.
Значення
client_secret
не має бути доступним для фронт-енд додатків.
Специфікація
Перевірки
Перевірити тип доступу
Перевірити, що поле
grant_type
вказано в запиті та не рівне nullв разі помилки - повернути 422 ('Request must include grant_type.')
Перевірити, що значення поля
grant_type
рівне ‘authorization_code’в разі помилки - повернути 401 ('Grant type not allowed.')
Перевірити код доступу
Перевірити, що поле
code
вказано в запиті та не рівне nullв разі помилки - повернути 422 ('can't be blank')
Перевірити код доступу =
code
та назва = ‘authorization_code’ існує в базі даних mithril, таблицяtokens
в разі помилки - повернути 401 ('Token not found.')
Перевірити код доступу, що він дійсний в базі даних mithril, таблиця
tokens
(expires_at
в майбуньому)в разі помилки - повернути 401 ('Token expired.')
Перевірити, що код ще не був використаний по базі даних mithril, таблиця
tokens
(details.used
<> true)в разі помилки - повернути 401 ('Token has already been used.')
Перевірити клієнта
Перевірити, що поля
client_id
та client_secret вказані в запиті та не пустів разі помилки - повернути 422 ('can't be blank')
Перевірити, що клієнт не заблокований в базі даних mithril, таблиця
tokens
(is_blocked
<> true)в разі помилки - повернути 401 ('Client is blocked)
Перевірити, що клієнт з коду доступу рівний до
client_id
в разі помилки - повернути 401 ('Token not found or expired.')
Перевірити, що
client_secret
належить клієнту з бази даних mithril, таблицяconnections
в разі помилки - повернути 401 ('Invalid client id or secret.')
Перевірити uri для перенаправлення
Перевірити, що поле
redirect_uri
присутнє в запиті і не пусте emptyв разі помилки - повернути 422 ('can't be blank')
Перевірити, що
redirect_uri
в запиті рівний uri для перенаправлення в коді доступув разі помилки - повернути 401 ('The redirection URI provided does not match a pre-registered value.')
Перевірити, що uri для перенаправлення належить кліжнту по базі даних mithril, таблиця
connections
використовуючиclient_id
в разі помилки - повернути 401 ('The redirection URI provided does not match a pre-registered value.')
Перевірити апрували
Перевірити апрували по переліку скоупів для
app_id
з коду доступу в базі даних mithril, таблицяapps
в разі помилки - повернути 401 ('Resource owner revoked access for the client.')
Сервісна логіка
Оновити код доступу в базі даних mithril, таблиця
tokens
, встановити:details.used = true
updated_at = now()
Згенерувати ‘access token’ з запитаними скоупами для
user_id
таclient_id
на основі значення конфігураційного параметру ACCESS_TOKEN_JWT:true - згенерувати токен в форматі JWT у відповідності до Access tokens JWT format
false - згенерувати токен в поточному форматі
Згенерувати ‘refresh token’.
Зберегти згенеровані токени в існуючому форматі в базу даних mithil, таблиця
tokens
, встановити:id = uuid токену
name = назва токену (‘access_token’ або ‘refresh_token')
value = хеш токену
expires_at = дата та час закінчення строку дії токену в форматі unix-time
details = додаткові деталі по токену (scopes, client_id, grant_type, applicant_user_id, applicant_person_id, app_id)
applicant_user_id = значення з
details.applicant_user_id
з grant code (якщо вказано)applicant_person_id = значення з
details.applicant_person_id
з grant code (якщо вказано)app_id = uuid погодження між
user_id
,applicant_user_id
таclient_id
user_id = id користувача
inserted_at = now()
updated_at = now()
Відобразити відповідь у відповідності до специфікації.
ЕСОЗ - публічна документація