Auth API

Статус документа

Оглавление

Цель и смысл

Данный документ описывает реализацию аутентификации пользователей и авторизации приложений. Auth API реализует протокол авторизации в соответствии с OAuth 2.0 Framework.

Варианты использования, приводящие к данному API, описаны на странице вариантов использования истории просмотра.

Термины и определения

В этом документе используются термины и определения, описанные в документах «О программных интерфейсах сервисов Инетры» и «Термины и определения».

Предметная область

Пользователь

Пользователи разделены на две группы:

Токен доступа

Токены доступа могут быть двух видов:

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

PIN-код

Отдельно реализован запрос цифрового PIN–кода переменной длины, от 6 до 15 знаков (рекомендуемая длина 9[1] знаков), который живет короткое время (рекомендуемое время жизни 15 минут). Аутентифицированный пользователь (в том числе, анонимный) с помощью такого временного токена доступа имеет возможность аутентификации на другом устройстве без необходимости ввода дополнительной информации.

Регистрация приложения

Каждое авторизующееся приложение должно иметь свой идентификатор и секретный ключ, которые в дальнейшем используются в методах данного API в параметрах client_id и client_secret, соответственно. Для получения значений необходимо зарегистрировать приложение.

На данный момент получение данных значений возможно с помощью службы технической поддержки компании Инетра (support@inetra.ru) с предоставлением дополнительных данных:

Аутентификация при помощи токена доступа

Клиент должен выполнять аутентификацию в соответствии с типом выданного токена доступа. Для аутентификации по типу токена «Bearer» предусмотрено 2 способа:

Пример задания HTTP заголовка Authorization для схемы авторизации «Bearer»:

Authorization: Bearer 18dasd81230dah12032

Способы авторизации

Auth API предусматривает различные способы авторизации приложения:

Авторизация для анонимной учетной записи не предусматривает выполнения каких-либо действий со стороны пользователя. Для получения токена доступа клиент может воспользоваться методом token.

Авторизация для персональной учетной записи требует от пользователя выполнения дополнительных действий. Пользователь должен ввести логин/пароль и авторизовать приложение в веб–форме, открытой клиентом (см. метод authorize).

Авторизация по PIN–коду и коду устройства требует наличие двух устройств: авторизованное и авторизующееся — описание механизма приведено в разделе «Авторизация по PIN–коду и коду устройства».

Авторизация по PIN–коду и коду устройства

Приложение может осуществить авторизацию при помощи другого авторизованного приложения. Для этого авторизующееся приложение должно получить код устройства и PIN–код (см. метод device_code). Авторизующееся приложение должно отобразить полученный PIN–код в графическом интерфейсе и предложить пользователю ввести PIN–код в другом авторизованном приложении.

После ввода PIN–кода пользователем авторизованное приложение должно подтвердить авторизацию (см. метод authorize), в это время авторизующееся приложение должно периодически проверять завершение процесса авторизации (см. метод token).

Слияние учетных записей

При слиянии деревьев данных двух учетных записей они должны быть объединены в единое дерево, при этом всегда есть источник данных и получатель, а слияние данных — суть слияние корневого элемента источника в корневой элемент получателя.

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

function merge_users(dst, src, resolve_hint) {
  if (resolve_hint === 'auto') {
    if (is_anonymous(src)) {
      if (is_anonymous(dst)) {
        resolve_hint = 'mine';
      } else {
        resolve_hint = 'their';
      }
    } else { // src not anonymous
      if (is_anonymous(dst)) {
        resolve_hint = 'mine';
      } else {
        return false;
      }
    }
  }
  merge_elements(dst.root, src.root, resolve_hint === 'mine');
  return true;
}

Механизм слияния пользовательских данных описан в разделе «Слияние элементов» в User Data API

Взаимодействие с API

Сервис API должен присутствовать в Регистратуре в списке сервисов. Рекомендуется выполнять запросы к API по защищенному соединению (протокол HTTPS).

Параметры методов API передаются в параметрах запроса для GET метода или в теле сообщения для POST метода. Обращение к методам API строится по схеме (на примере GET метода):

https://api.peers.tv/auth/2/<method>?[<parameters>]

Где:

Формат ответов всегда JSON.

Значения всех параметров перед передачей серверу необходимо кодировать для предотвращения неоднозначной интерпретации так, как это рекомендуется в RFC3986.

Стандартные коды ответов

Для каждого метода API предусмотрены стандартные коды ответов (RFC2616). Ниже описана интерпретация некоторых кодов:

Для HTTP кодов ответа 401, 403 должен быть передан HTTP заголовок WWW-Authenticate с указанием ожидаемой схемы аутентификации и дополнительнной информации (если применимо). Например, для схемы «Bearer» может быть указан дополнительный атрибут error со значением:

Методы

authorize — получение авторизации от пользователя

Клиент должен открыть сформированный запрос в веб–браузере, указав необходимые параметры:

параметр значение
response_type тип возвращаемого ответа
client_id идентификатор клиента
Опциональные параметры
redirect_uri адрес, на который будет выполнено перенаправление после завершения операции
state идентификатор сессии авторизации, который будет возвращен в ответе. Формируется клиентом.

Возможные значения параметра response_type:

Клиент может не указывать параметр redirect_uri, если адрес перенаправления должен быть фиксирован и был задан при регистрации клиента (например, в случае клиента, работающего в контексте веб–браузера).

Замечание:

Возвращаемые значения

После завершения операции клиент будет перенаправлен на адрес перенаправления (параметр запроса redirect_uri, либо указанный при регистрации приложения), в который сервер добавит дополнительные параметры, соотвествующие типу возвращаемого ответа (параметр запроса response_type).

Возвращаемые значения:

параметр значение
code код авторизации (для значения code в параметре запроса response_type)
state идентификатор сессии авторизации, переданный в запросе
Ошибки
error код ошибки (см. «Возможные ошибки»)
error_description описание ошибки (опционально)
error_uri адрес веб–страницы для отображения ошибки пользователю (опционально)

Если в запросе был передан параметр state, клиент должен проверить, что в адресе перенаправления присутствует данный параметр со значением, указанным в запросе.

При возникновении ошибки в адресе перенаправления будет указан код ошибки (параметр error).

token — получение токена доступа

Параметры метода должны передаваться методом POST в формате application/x-www-form-urlencoded.

Основные параметры для аутентификации:

параметр значение
grant_type тип аутентификации
client_id идентификатор клиента
client_secret разделяемый секрет клиента
По коду авторизации
code код авторизации
redirect_uri адрес перенаправления, если был задан при получении кода
Возобновление токена доступа
refresh_token токен возобновления доступа
По PIN–коду и коду устройства
device_code код, выданный для устройства (см. метод device_code)
Опциональные параметры
anonymous_token токен анонимной учетной записи, с которой необходимо выполнить слияние (для типов аутентификации authorization_code, inetra:device_code). Алгоритм слияния описан в разделе «Слияние учетных записей»
signature информация о цифровой подписи приложения, для android — base64-кодированный SHA1-хэш от цифровой подписи.
mac мак адрес устройства. На 12.21.2022 передаётся только на платформах Tizen И Webos.

Формат ответа: TokenReply

Возможные значения для параметра grant_type:

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

Для отображения информации об аккаунте клиент может воспользоваться методом account.

Замечания по mac: Параметр является необязательным и передаётся в нижнем регистре. Если активно несколько интерфейсов, тогда следует передавать все доступные значения в одном параметре, а в качестве разделителя между разными мак адресами использовать символ запятой. Параметр передаётся как при регистрации анонимного пользователя, так и при любом другом запросе к auth. В качестве разделителя в мак адресе используется символ двоеточия.

ВАЖНО: для обеспечения возможности плавной миграции с первой версии будут действовать следующие правила:

Возможные ошибки

строковая константа описание ошибки
invalid_request неправильный запрос, ошибочные параметры, отсутствуют обязательные параметры или некорректные параметры для данного grant_type
invalid_client неизвестный client_id, неразрешенный grant_type для данного клиента, неверное значение client_secret
invalid_grant неверные данные для получения авторизации (логин/пароль, токен возобновления или код устройства)
unauthorized_client клиент неавторизован для данного grant_type
unsupported_grant_type неизвестное значение параметра grant_type
authorization_pending ожидание авторизации, актуально для авторизации по коду устройства
access_denied владелец ресурса или сервер авторизации отклонил запрос на авторизацию

Замечания:

Пример успешного взаимодействия

Запрос

POST /auth/2/token HTTP/1.1
Host: api.peers.tv
Content-Type: application/x-www-form-urlencoded

grant_type=inetra%3Aanonymous&client_id=91801674-777e-4edd-aacc-1911c7262115&client_secret=3WzahKEFZqhm3GpowLAsS4

Ответ

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

{
  "access_token":"2YotnFZFEjr1zCsicMWpAA",
  "token_type":"bearer",
  "refresh_token":"18da91mb0FOA7eZ3n4Ad8A",
  "expires_in":3600  
}

device_code — получение кода устройства для авторизации через другое приложение

Параметры метода должны передаваться методом POST в формате application/x-www-form-urlencoded.

Дополнительные параметры запроса:

параметр значение
client_id идентификатор клиента

Формат ответа: DeviceCode

При возникновении ошибок сервер возвратит соотвествующий HTTP код ответа (cм. Стандартные коды ошибок).

Пример успешного взаимодействия

Запрос

POST /auth/2/device_code HTTP/1.1
Host: api.peers.tv

client_id=91801674-777e-4edd-aacc-1911c7262115

Ответ

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

{
  "pin":"8Df-2a1",
  "device_code":"j8a-1daj27fal1sueq39178s",
  "expires_in":1800,
  "interval":10
}

account — информация об учетной записи

Формат ответа: AccountInfo

Замечание: метод требует аутентификации пользователя

Пример успешного взаимодействия

Запрос

GET /auth/2/account HTTP/1.1
Host: api.peers.tv
Authorization: Bearer 2YotnFZFEjr1zCsicMWpAA

Ответ

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

{
  "username":"v_ivanov@peers.tv",
  "account_id":"398E944A-5475-4FAB-95BA-FCB9A86DD3FA"
}

Запрос

GET /auth/2/account?access_token=5f1080e637a545eeb68e99fbdfffdce4 HTTP/1.1
Host: api.peers.tv

Ответ

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

{
  "account_id": 379907910,
  "cid": 104
}

Спецификация API для Protocol Buffers

TokenReply — получение токена доступа

message TokenReply {
  optional string access_token = 1;
  optional string token_type = 2;
  optional int32 expires_in = 3;
  optional string refresh_token = 4;

  optional string error = 5;
  optional string error_description = 6;
}

Замечания:

В случае успешной аутентификации должны быть возвращены атрибуты access_token, refresh_token, token_type и expires_in. В случае ошибки — в теле ответа содержится атрибут error и error_description.

DeviceCode — получение кода устройства

message DeviceCode {
  optional string pin = 1;
  optional string device_code = 2;
  optional int32 expires_in = 3;
  optional int32 interval = 4;
}

Замечания:

AccountInfo — информация об учетной записи

message AccountInfo {
  optional string username = 1;
  optional uint64 account_id = 2;
  optional uint64 сid = 3;
}

Замечания:

Изменения по версиям

Изменения в версии 1.1.0

Изменения в версии 1.1.1

Изменения в версии 1.2.0

Изменения в версии 1.3.0 (TVREC–245, TVREC–246)

Изменения в версии 1.3.1

Изменения в версии 1.3.2

Изменения в версии 1.4.0

Изменения в версии 1.4.1

Изменения в версии 1.4.2

Изменения в версии 1.5.0

Изменения в версии 2.0.0 (TVREC–727, TVREC–720)

Изменения в версии 2.0.1

Изменения в версии 2.0.2

Изменения в версии 2.0.3

Изменения в версии 2.1.0

Изменения в версии 2.1.1 (WEBDEV–11274)

Изменения в версии 2.2.0 (WEBDEV–11388)

Изменения в версии 2.2.1


  1. Длина PIN-кода выбирается как баланс между простотой и безопасностью. Альфа-Банку хватает 6-ти символов для подтверждения банковских операций.  ↩