ЕСОЗ - публічна документація

UA_Exchange oAuth Code Grant to Access Token

Мета

Цей WS призначений для обміну кодом авторизації із запитаними скоупами для токену доступу для користувача та клієнта.

Ключові положення

  1. Даний метод має використовуватись тільки бек-енд частиною додатків.

  2. Значення client_secretне має бути доступним для фронт-енд додатків.

Специфікація

Apiary

Перевірки

Перевірити тип доступу

  • Перевірити, що поле 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.')

Сервісна логіка

  1. Оновити код доступу в базі даних mithril, таблиця tokens, встановити:

    1. details.used = true

    2. updated_at = now()

  2. Згенерувати ‘access token’ з запитаними скоупами для user_id та client_id на основі значення конфігураційного параметру ACCESS_TOKEN_JWT:

  3. Згенерувати ‘refresh token’.

  4. Зберегти згенеровані токени в існуючому форматі в базу даних mithil, таблиця tokens, встановити:

    1. id = uuid токену

    2. name = назва токену (‘access_token’ або ‘refresh_token')

    3. value = хеш токену

    4. expires_at = дата та час закінчення строку дії токену в форматі unix-time

    5. details = додаткові деталі по токену (scopes, client_id, grant_type, applicant_user_id, applicant_person_id, app_id)

      1. applicant_user_id = значення з details.applicant_user_id з grant code (якщо вказано)

      2. applicant_person_id = значення з details.applicant_person_id з grant code (якщо вказано)

      3. app_id = uuid погодження між user_id, applicant_user_id та client_id

    6. user_id = id користувача

    7. inserted_at = now()

    8. updated_at = now()

  5. Відобразити відповідь у відповідності до специфікації.

ЕСОЗ - публічна документація