Rest API Аутентификация пользователя - datawizio/pythonAPI GitHub Wiki
Аутентификация - это процесс проверки личности пользователя, и в случае подтверждения, авторизации его с конкретными правами. REST API построена по принципу разделения ресурсов, при котором доступ к конкретному ресурсу получает только владелец даного ресурса. При таком подходе пользователь может быть уверен в сохранности своих данных. REST API поддерживает 2 протокола аутентификации пользователя - OAuth 2.0
и HTTPSignatureAuthentication (идентификация по подписи)
. Ниже описан каждый из этих протоколов в отдельности
Протокол OAuth 2.0 работает по очень простой схеме, которую можно представить в два этапа:
- Авторизация пользователя
- Получение токена для доступа к защищенным ресурсам
client_id:<client_id>
client_secret:<client_secret>
grant_type:password
username:"<your username>
password:"<your password>
где client_id, client_secret
- специальный ключ и подпись, уникальные для каждого сервиса, использующего REST API, grant_type
- тип авторизации (в даном случае по даным пользователя), username
- логин пользователя, password
- пароль пользователя. Для получения ключа пишите на [email protected].
Полученный обьект отправляем POST-запросом на http://api.datawiz.io/api/o/token/
, явно указывая в заголовках тип содержимого (напр. Content-Type: application/x-www-form-urlencoded
)
Ответ сервера при успешной авторизации:
{
"access_token": "a4z4XoChBtHFGyMVrebwgnVcUnDEFc",
"token_type": "Bearer",
"expires_in": 36000,
"refresh_token": "ea9sPsCPyRScREoDVl95MkQPiCF1T5",
"scope": "read write"
}
Полученный access_token
теперь можно использовать для авторизации команд REST API. Пример запроса к серверу, с использованием access_token
:
Request
GET http://api.datawiz.io/api/v1/
Headers
Host: api.datawiz.io,
Accept: application/json,
Date: Mon, 17 Feb 2014 06:11:05 GMT,
Authorization: Bearer a4z4XoChBtHFGyMVrebwgnVcUnDEFc
После выполнения запроса сервер вернет статус 200 (команда авторизирована), либо 401(команда неавторизирована). Каждый access_token
выдается на определенный период времени (указаный в expires_in
), после чего пользователю нужно пройти повторную автентификацию.
Протокол использует идентификатор ключа доступа и секретный ключ.
Подпись помогает обеспечить защиту в следующих случаях:
- Аутентификация команды. Подпись гарантирует что команда делается тем, кто действительно имеет идентификатор ключа и секретный ключ. Для получения ключа пишите:[email protected].
- Защита данных при пересылке. Некоторые из элементов команды используются для вычисления хэш-функции, значение которой указывается как часть команды. Когда команда обрабатывается сервером - так же рассчитывается значение хеш-функции и сравнивается со значением из тела команды. Таким образом проверяется не было ли изменений данных при пересылке.
Для подписи нужно вычислить хеш команды по алгоритму hmac-sha256
используя идентификатор ключа, секретный ключ, указать какие заголовки команд будут подписаны (все примеры ниже будут базироваться на коде языка python).
# список заголовков, значения которых будут подписаны:
signature_headers = ['(request-target)', 'accept', 'date', 'host']
формирование подписи аутентификации
auth = HTTPSignatureAuth(
key_id = KEY_ID, # идентификатор ключа
secret = SECRET, # секретный ключ
algorithm = 'hmac-sha256', # алгоритм
headers = signature_headers # список заголовков (опционально)
)
Дальше необходимо использовать это значение как подпись HTTP запроса.
Сначала формируем заголовок HTTP
# заголовок HTTP
headers = {
'Host': 'api.datawiz.io',
'Accept': 'application/json',
'Date': "Mon, 17 Feb 2014 06:11:05 GMT",
'content-type': 'application/json'
}
Добавить подпись команде можно используя заголовок авторизации HTTP (HTTP Authorization header).
Подпись POST команды с данными
# подпись команды
response = requests.post(
url, # url команды, например `POST http://api.datawiz.io/api/v1/products/.json`
data=json.dumps(data), # данные в формате JSON
auth=auth, # подпись аутентификации, сформированая выше
headers=headers # заголовок HTTP
)
Подпись GET команды
response = requests.get(
url, # url команды, например `GET http://api.datawiz.io/api/v1/receipts/`
auth=auth, # подпись аутентификации, сформированая выше
headers=headers, # заголовок HTTP
params=params # параметры команды, например `format=json&page_size=2`
)