Wiki

Clone wiki

darudar-backend / Авторизация

#Идентификация [TOC]

##OAuth2 авторизация OAuth2-клиенты могут быть 2 типов:

  • Конфиденциальные (server-hosted, когда client_secret может быть храниться и использоваться безопасно)
  • Публичные (client-hosted, когда клиент не может обеспечить безопасного хранения и испольования секрета)

В случае "Публичных" клиентов проверки client_secret не осуществляется, но и прав доступно меньше.

Поддерживаются следующие grant_type:

Grant type: Password

URI: POST ~/auth/oauth2/token

Данный тип авторизации доступен только "доверенным" клиентам.

Если вы используете данный тип авторизации, то обязательно проверяйте поле aud используемого JWT-токена перед отправкой запроса на сервер

Обязательные параметры:

Параметр Описание
grant_type =password
client_id ID-клиента, который запрашивает авторизацию пользователя
client_secret Секрет клиента, который запрашивает авторизацию пользователя
username Логин или Email пользователя
password Пароль пользователя
scope Запрашиваемые права

Для "Публичных" клиентов параметр client_secret не используется.

Пример запроса

POST /auth/oauth2/token HTTP/1.1
HOST: api.darudar.org
content-type: application/x-www-form-urlencoded

grant_type=password&client_id=<client_id>&username=<login>&password=<password>

В успешной авторизации в ответе придёт access_token (JWT) для дальнейшей авторизации, а так-же refresh_token (JWT) для обновления доступа. Пример ответа представлен ниже:

#!json
{
  "token_type": "Bearer",
  "expires_in": 3600,
  "access_token": <access_token>,
  "refresh_token": <refresh_token> // <-- возвращается только для конфиденциальных клиентов (!)
}

Полученный access_token "живёт" expires_in секунд. Затем его можно обновить используя refresh_token (только для "конфиденциальных" клиентов).

Grant type: Implicit

URI: GET ~/auth/oauth2/authorize

Реализует доступ к токену авторизации для client-hosted приложений. В настоящий момент работает только для уже авторизованных пользователей(!).

Если вы используете данный тип авторизации, то обязательно проверяйте поле aud используемого JWT-токена перед отправкой запроса на сервер

Для данного типа авторизации есть возможность "обновить" access_token, для уже авторизованных пользователей добавив дополнительный параметр prompt со значением none (&prompt=none). В случае такого запроса или вернётся ответ с обновлённым токеном (если пользователь ещё авторизован) или же ошибка (если пользователь больше не авторизован).

Обязательные параметры:

Параметр Описание
response_type =token
client_id ID-клиента, который запрашивает авторизацию пользователя
redirect_uri URI на который будет перенаправлен ответ сервера авторизации (APP_CALLBACK_URI)
state Идентификатор сессии для валидации ответа
scope Запрашиваемые права

Пример запроса

GET /auth/oauth2/token HTTP/1.1
HOST: api.darudar.org
content-type: application/x-www-form-urlencoded

response_type=token&client_id=<client_id>&redirect_uri=<APP_CALLBACK_URI>&state=<state-session-string>

В успешной авторизации будет произведён редирект на указанный урл с хеш-параметром в котором будет содержаться access_token (JWT) для дальнейшей авторизации

Пример ответа представлен ниже:

Redirect to: APP_CALLBACK_URI#access_token=<access_token>&state=<state>

Перед проверкой и использованием access_toekn следует обязательно проверить параметр state (!).

Grant type: Authorization Code

URI: GET ~/auth/oauth2/authorize

Если вы используете данный тип авторизации, то обязательно проверяйте поле aud используемого JWT-токена перед отправкой запроса на сервер

Обязательные параметры:

Параметр Описание
response_type =code
client_id ID-клиента, который запрашивает авторизацию пользователя
client_secret Секрет клиента, который запрашивает авторизацию пользователя
redirect_uri URI на который будет перенаправлен ответ сервера авторизации (APP_CALLBACK_URI)
state Идентификатор сессии для валидации ответа
scope Запрашиваемые права

Для "Публичных" клиентов параметр client_secret не используется.

Пример запроса

GET /auth/oauth2/authorize HTTP/1.1
HOST: api.darudar.org
content-type: application/x-www-form-urlencoded

response_type=code&client_id=<client_id>&username=<login>&state=<state-session-string>

В успешной авторизации будет произведён редирект на указанный урл с параметром code.

Пример ответа:

Redirect to: APP_CALLBACK_URI?code=<code>&state=<state>

Перед выполнением следующего запроса требуется обязательно проверить параметр state для предотвращения подмены кода авторизации. (!) Затем следует выполнить следующий запрос:

Обязательные параметры:

Параметр Описание
grant_type =authorization_code
client_id ID-клиента, который запрашивает авторизацию пользователя
client_secret Секрет клиента, который запрашивает авторизацию пользователя
code Код, присланный в первом запросе

Пример запроса

POST /auth/oauth2/token HTTP/1.1
HOST: api.darudar.org
content-type: application/x-www-form-urlencoded

grant_type=authorizatin_code&client_id=<client_id>&code=<code>

В успешном выполнении запроса в ответе придёт access_token (JWT) для дальнейшей авторизации, а так-же refresh_token (JWT) для обновления доступа. Пример ответа представлен ниже:

#!json
{
  "token_type": "Bearer",
  "expires_in": 3600,
  "access_token": <access_token>,
  "refresh_token": <refresh_token>
}

Полученный access_token "живёт" expires_in секунд. Затем его можно обновить используя refresh_token (только для "конфиденциальных" клиентов).

Grant type: Refresh Token

URI: POST ~/auth/oauth2/token/

Данный тип авторизации используется для получения нового access_token после его инвалидации.

Обязательные параметры:

Параметр Описание
grant_type =refresh_token
client_id ID-клиента, который запрашивает авторизацию пользователя
refresh_token Собственно refresh_token (must be urlencoded!)

Пример запроса:

POST /auth/oauth2/token HTTP/1.1
HOST: api.brutto.dev.darudar.com
content-type: application/x-www-form-urlencoded

grant_type=refresh_token&client_id=<client_id>&refresh_token=<refresh_token>

Пример ответа:

#!json
{
  "token_type": "Bearer",
  "expires_in": 3600,
  "access_token": <access_token>,
  "refresh_token": <refresh_token>
}

В ответе приходит стандартный JSON-объект с новыми актуальными авторизационными данными.

##Восстановление доступа к учетной записи

Для восстановления доступа необходимо чтобы в учётной записи был указан рабочий email-адрес или подтверждённый номер мобильного телефона (пока не реализовано).

Запрос на восстановление пароля

URI: POST ~/auth/recover/request

Параметр Описание
client ID-клиента, который запрашивает авторизацию пользователя
recover Логин или email-адрес пользователя, для которого требуется восстановить пароль

Пример запроса:

POST /auth/recover/request HTTP/1.1
Host: api.brutto.dev.darudar.com
Content-type: application/json

{"client": "<client-id>", "recover": "<login_or_email>"}

При успешно выполненом запросе на почту указанного пользователя будет отправлено письмо со ссылкой, перейдя по которой он сможет завершить процедуру смены пароля профиля.

Пример ответа:

#!json
{
    "recover": "send"
}
Код ответа 202 (!).

Подтвежрдение смены пароля

URI: POST ~/auth/recover/submit/<code>

<code> обязательный параметр из полученного письма.

Параметр Описание
password Новый пароль пользователя
password_confirm Потверждение нового пароля (повторить значение поля password)

Пример запроса:

POST /auth/recover/submit/<code> HTTP/1.1
Host: api.brutto.dev.darudar.com
Content-type: application/json

{"password": "<pass-string>","password_confirm": "<pass-string>"}

Пример ответа:

#!json
{
    "recover": "ok"
}

Внешняя авторизация

URI: GET ~/auth/oauth2/external/go/<provider>

Данный endpoint запускает процедуру внешней авторизации (происходит редирект на авторизацию). Параметр<provider> является указателем на провайдера внешней авториазции. Доступны следующие:

  • goog -- Гугл
  • fb -- Фейсбук
  • vk -- Вконтакте
  • ok -- Одноклассника

Параметры (QUERY_PARAMS) аналогичные Implicit и Authorization Code (см. выше).

Пример запроса:

GET /auth/oauth2/external/go/goog?client_id=dd-oauth2.bbbd818b0d4f0eb33eb2cce8d217fa57666773ba&redirect_uri=https://app.darudar.org/auth/external&response_type=token HTTP/1.1
Host: api.brutto.dev.darudar.com
Content-type: application/json

При успешном завершении авторизации произодёт редирект с переданными изначально параметрами на endpoint /auth/oauth2/authorize?QUERY_PARAMS, откуда уже будет перенаправлен или сразу на APP_CALLBACK_URI (implicit) или на дальнейшую продеруду завершения авторизации (authorization_code).

При возникновении ошибки по причине отсутвия внешнего профиля в системе помимо стандартных параметров (error, message, hint) так же приходит параметр external_identity, который является JWT-токеном и содержит информацию о подключаемом профиле. Этот параметр можно использовать при регистрации.

Внутренняя авторизация (ограниченный доступ)

URI: POST ~/auth/sign-in

Даннйы метод используется только для внутренних (собственных) клиентов.

Параметр Описание
login Логин пользователя или его email
password Пароль
client_id Идентификатор клиента
redirect_uri Редирект
response_type Тип ответа после редиректа
state Строка состояния

В зависимости от переданного Accept-заголовка данный метод возвращает в ответе или json-объект если это application/json с токеном доступа (см. выше) или делает редирект на ~/auth/authorize если это text/html.

Выход

URI: POST ~/auth/sign-out

Завершает пользовательскую сессию на сервере авторизации.

Пример запроса:

POST /auth/sign-out HTTP/1.1
Host: api.brutto.dev.darudar.com
Cache-Control: no-cache

Пример ответа:

#!json
{
    "signout": "ok"
}

Регистрация

Создание аккаунта

При создании аккаунта в системе требуется его последующая "активация" (кроме некоторых случаев внешней регистрации). Для этого необходимо перейти по ссылке в письме, которое высылается на адрес указанный при заполнении формы.

Параметр Описание
name Имя, которое будет отображаться в созданном профиле
client_id ID-клиента, который запрашивает регистрацию пользователя
email Контактный email-адрес (используется для авторизации)
password Пароль для доступа (используется для авторизации)
rules_accepted Флаг, который подтверждает согласие с пользовательским соглашением
external_identity JWT-токен полученный при неудачной внешней авторизации

Пример запроса

POST /auth/sign-up HTTP/1.1
Host: api.brutto.dev.darudar.com
Accept: application/json
Content-Type: application/json

{
  "client": "<client-id>",
  "email": "my-email@example.com",
  "name": "Антон Карапуль",
  "password": "<password>",
  "rules_accepted": 1,
  "external_identity": <token>
}

Пример ответа

#!json
{
    "signup": "send_activation" <-- или 'ok', если активации не требуется
}

В зависимости от переданного Accept-заголовка данный метод возвращает в ответе или json-объект если это application/json с токеном доступа (см. выше) или делает редирект на ~/auth/sign-in если это text/html.

Активация аккаунта

URI: POST ~/auth/activate/<token>

Активирует профиль для которого был выпушен <token>. Выпущенный токен валиден в течение 30 дней с момента выпуска.

Пример запроса

POST /auth/activate/<token> HTTP/1.1
Host: api.brutto.dev.darudar.com

Пример ответа

#!json
{
    "activate": "ok"
}

Внешняя регистрация

Внешняя регистрация -- это регистрация при помощи внешних сервисов авторизации. Она осуществляется через последовательный вызов метода "внешней авторизации" для получения токена-внешнего-профиля (external_identity) и последующим вызова метода "регистрации" с передачей данного дополнительного параметра external_identity.

Updated