Данный документ описывает реализацию аутентификации пользователей и авторизации приложений. Auth API реализует протокол авторизации в соответствии с OAuth 2.0 Framework.
Варианты использования, приводящие к данному API, описаны на странице вариантов использования истории просмотра.
В этом документе используются термины и определения, описанные в документах «О программных интерфейсах сервисов Инетры» и «Термины и определения».
Пользователи разделены на две группы:
Токены доступа могут быть двух видов:
После получения токен доступа действует ограниченное время, указанное в ответе. На стороне клиента необходимо реализовывать обработку ошибки просроченного токена и получать новый токен доступа. Токен доступа также характеризуется типом, указывающим на схему авторизации, которую должен использовать клиент.
Отдельно реализован запрос цифрового PIN–кода переменной длины, от 6 до 15 знаков (рекомендуемая длина 9[1] знаков), который живет короткое время (рекомендуемое время жизни 15 минут). Аутентифицированный пользователь (в том числе, анонимный) с помощью такого временного токена доступа имеет возможность аутентификации на другом устройстве без необходимости ввода дополнительной информации.
Каждое авторизующееся приложение должно иметь свой идентификатор и секретный ключ, которые в дальнейшем используются в методах данного API в параметрах client_id
и client_secret
, соответственно. Для получения значений необходимо зарегистрировать приложение.
На данный момент получение данных значений возможно с помощью службы технической поддержки компании Инетра (support@inetra.ru) с предоставлением дополнительных данных:
Клиент должен выполнять аутентификацию в соответствии с типом выданного токена доступа. Для аутентификации по типу токена «Bearer» предусмотрено 2 способа:
Authorization
(рекомендуемый способ);access_token
Пример задания HTTP заголовка Authorization
для схемы авторизации «Bearer»:
Authorization: Bearer 18dasd81230dah12032
Auth API предусматривает различные способы авторизации приложения:
Авторизация для анонимной учетной записи не предусматривает выполнения каких-либо действий со стороны пользователя. Для получения токена доступа клиент может воспользоваться методом token
.
Авторизация для персональной учетной записи требует от пользователя выполнения дополнительных действий. Пользователь должен ввести логин/пароль и авторизовать приложение в веб–форме, открытой клиентом (см. метод authorize
).
Авторизация по 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 по защищенному соединению (протокол HTTPS).
Параметры методов API передаются в параметрах запроса для GET метода или в теле сообщения для POST метода. Обращение к методам API строится по схеме (на примере GET метода):
https://api.peers.tv/auth/2/<method>?[<parameters>]
Где:
<method>
— имя метода (например, token
)<parameters>
— параметры методаФормат ответов всегда JSON.
Значения всех параметров перед передачей серверу необходимо кодировать для предотвращения неоднозначной интерпретации так, как это рекомендуется в RFC3986.
Для каждого метода API предусмотрены стандартные коды ответов (RFC2616). Ниже описана интерпретация некоторых кодов:
200
— запрос успешно обработан400
— некорректно составлен запрос:
401
— требуется аутентификация:
403
— доступ запрещен:
Для HTTP кодов ответа 401
, 403
должен быть передан HTTP заголовок WWW-Authenticate
с указанием ожидаемой схемы аутентификации и дополнительнной информации (если применимо). Например, для схемы «Bearer» может быть указан дополнительный атрибут error
со значением:
invalid_token
— передан некорректный, просроченный или отозванный токен доступа (код 401
);insufficient_scope
— запрос требует более высоких привилегий, чем те, которыми обладает токен доступа (код 403
).authorize
— получение авторизации от пользователяКлиент должен открыть сформированный запрос в веб–браузере, указав необходимые параметры:
параметр | значение |
---|---|
response_type |
тип возвращаемого ответа |
client_id |
идентификатор клиента |
Опциональные параметры | |
redirect_uri |
адрес, на который будет выполнено перенаправление после завершения операции |
state |
идентификатор сессии авторизации, который будет возвращен в ответе. Формируется клиентом. |
Возможные значения параметра response_type
:
code
— авторизация по коду. Полученный код авторизации клиент должен использовать для получения токена доступа (см. метод token
);pin_code
— авторизация по PIN–коду устройства (см. сценарий использования)Клиент может не указывать параметр redirect_uri
, если адрес перенаправления должен быть фиксирован и был задан при регистрации клиента (например, в случае клиента, работающего в контексте веб–браузера).
Замечание:
Bearer
(как часть query или через заголовок), чтобы пропустить шаг регистрации/авторизации.После завершения операции клиент будет перенаправлен на адрес перенаправления (параметр запроса 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
:
authorization_code
— аутентификация по коду авторизации;refresh_token
— возобновление токена доступа;inetra:anonymous
— анонимная аутентификация, дополнительные параметры не требуются;inetra:device_code
— аутентификация по коду устройства при помощи другого авторизованного приложения (после получения авторизации по PIN-коду).При успешном выполнении операции будет передан токен доступа с указанием схемы аутентификации. Срок действия токена ограничен. При восстановлении токена доступа будет выдан новый токен доступа, токен для возобновления доступа может быть обновлен.
Для отображения информации об аккаунте клиент может воспользоваться методом account
.
Замечания по mac
:
Параметр является необязательным и передаётся в нижнем регистре. Если активно несколько интерфейсов, тогда следует передавать все доступные значения в одном параметре, а в качестве разделителя между разными мак адресами использовать символ запятой. Параметр передаётся как при регистрации анонимного пользователя, так и при любом другом запросе к auth
.
В качестве разделителя в мак адресе используется символ двоеточия.
ВАЖНО: для обеспечения возможности плавной миграции с первой версии будут действовать следующие правила:
refresh_token
при возобновлении токена доступа. При этом бессрочный токен доступа конвертируется в токен возобновления, и не может быть использован в качестве токена доступа. Токены доступа со сроком действия не могут быть использованы в качестве токенов возобновления (код ответа — 401).строковая константа | описание ошибки |
---|---|
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 |
владелец ресурса или сервер авторизации отклонил запрос на авторизацию |
Замечания:
unsupported_grant_type
при авторизации может означать, что авторизация по данному типу запрещена для клиента и клиент должен воспользоваться другим типов авторизации, например, по логину/паролю. Такая ситуация может возникать у операторов связи, когда пользователь может быть аутентифицирован только по логину/паролю.invalid_grant
при возобновлении токена доступа может означать, что токен доступа был отозван и клиент должен повторно выполнить авторизацию, а в случае персонального токена доступа — повторно запросить у пользователя логин/пароль. Такая ситуация может возникать при смене пароля пользователем или отзыве авторизации у приложения.invalid_grant
при выполнении слияния с анонимной учетной записью может означать, что был передан токен доступа, который относится к персональной учетной записи, что является ошибкой кодирования.Запрос
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
}
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
— токен доступаtoken_type
— тип токена, который задает схему аутентификации, возможные типы:
bearer
— тип токена «Bearer».refresh_token
— токен возобновления доступа, необходимый для получения нового токена доступа. Срок жизни не ограничен, но может быть обновлен при получении нового токена доступа;expires_in
— время жизни полученного токена доступа, в секундах относительно времени запросаerror
— строковая константа, описывающая случившуюся ошибку (см. «Возможные ошибки»)error_description
— строка с сообщением, которое можно показать пользователю (если есть)В случае успешной аутентификации должны быть возвращены атрибуты 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;
}
Замечания:
pin
— PIN код, отображаемый в графическом интерфейсе, для ввода пользователем в другом приложении;device_code
— код устройства для получения токена доступа после завершения авторизации в другом авторизованном приложении;expires_in
— срок жизни выданных кодов (в секундах);interval
— интервал для проверки авторизации по коду устройства.AccountInfo
— информация об учетной записиmessage AccountInfo {
optional string username = 1;
optional uint64 account_id = 2;
optional uint64 сid = 3;
}
Замечания:
username
— уникальный идентификатор учетной записи, введенный пользователем, например, e-mail;account_id
— уникальный числовой идентификатор учетной записи (в пространстве идентификаторов оператора).uid
для аутентификации анонимного пользователя;TokenReply
добавлен атрибут renew_token
;UserCredentials
для возобновления доступа.purpose
для метода PinCode
;uid
для анонимной аутентификации;device_code
для получения кода устройства и PIN–кода для получения авторизации;UserCredentials
][m-user-credentials], [PinCode
][m-pin-code] исключены;token
для получения токена доступа;authorize
для получения авторизации у пользователя;
account
для получения информации об учетной записи пользователя;device_code
, используемый в методе token
для авторизации по коду устройства.token
для анонимной аутентификации.signature
в методе token
для передачи информации о цифровой подписи приложенияaccount_id
из сообщения AccountInfo
authorize
описана возможность передачи сессии авторизации по персональной учетной записи при авторизации по PIN коду.cid
в сообщение AccountInfo
Длина PIN-кода выбирается как баланс между простотой и безопасностью. Альфа-Банку хватает 6-ти символов для подтверждения банковских операций. ↩