Мета
Цей 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 у відповідності до /wiki/spaces/PCAB/pages/17426219114
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()
Відобразити відповідь у відповідності до специфікації.