Rest API Аутентификация пользователя - datawizio/pythonAPI GitHub Wiki

Аутентификация пользователя

Зачем нужна аутентификация?

Аутентификация - это процесс проверки личности пользователя, и в случае подтверждения, авторизации его с конкретными правами. REST API построена по принципу разделения ресурсов, при котором доступ к конкретному ресурсу получает только владелец даного ресурса. При таком подходе пользователь может быть уверен в сохранности своих данных. REST API поддерживает 2 протокола аутентификации пользователя - OAuth 2.0 и HTTPSignatureAuthentication (идентификация по подписи). Ниже описан каждый из этих протоколов в отдельности

OAuth 2.0 (рекомендуемый)

Протокол OAuth 2.0 работает по очень простой схеме, которую можно представить в два этапа:

  • Авторизация пользователя
  • Получение токена для доступа к защищенным ресурсам
Каждая команда REST API должна быть подписана – это значит что она должна иметь информацию при помощи которой REST API аутентифицирует её. В даном случае эту функцию выполняет специальный токен, полученый в процессе авторизации пользователя. Протокол 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), после чего пользователю нужно пройти повторную автентификацию.

HTTPSignatureAuthentication (будет удален в будущем)

Протокол использует идентификатор ключа доступа и секретный ключ.

Зачем нужно подписывать команды

Подпись помогает обеспечить защиту в следующих случаях:
- Аутентификация команды. Подпись гарантирует что команда делается тем, кто действительно имеет идентификатор ключа и секретный ключ. Для получения ключа пишите:[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`
    )
⚠️ **GitHub.com Fallback** ⚠️