При необходимости предоставления услуг REST API пользователям или при интеграции с другими сервисами, возникают важные вопросы, на которые мы вместе постараемся ответить в этой публикации:
- Как правильно создать REST API для своего сервиса или сайта?
- Какая логика функционирования REST API?
- Как максимально обезопасить обмен данными между клиентом и сервером?
Итак, сначала необходимо понять логику функционирования REST API в целом:
- Авторизуемся на клиенте и получаем TOKEN (или, иными словами, ID-сессии).
- Подписываем этим токеном запрос к API (хэшируем: передаём дополнительный параметр HASH) и отправляем запрос (с параметрами API, TOKEN'ом, HASH'ем, временной меткой: TIMESTAMP и случайным параметром: RANDOM) на сервер. Рекомендуется отправлять все параметры в одном поле и без выноса TOKEN'а отдельным параметром в заголовок запроса header, как делают многие: это даёт полную свободу выбора протокола обмена данными.
- В ответ на запрос, сервер может просто вернуть результат работы API, а может вместе с результатом вернуть новый токен: chain-token ("цепной"/связующий токен).
- Если приходит новый токен, то необходимо подписывать новый запрос к API уже этим новым токеном. (иначе - подписываем старым токеном)
- Если сервер возвращает ошибку, что токен неверен - необходимо перезапросить (перевыписать) токен, пройдя в "прозрачном" режиме процедуру получения нового токена, используя учётные данные, сохранённые на клиенте без привлечения пользователя к этому процессу (т.е. два пакета обмена информацией: "запрос-ответ", вместо одного).
Теперь, когда основной порядок действий стал понятен, необходимо разобраться в тонкостях формирования параметров TOKEN, HASH и в детальном процессе обмена данными между клиентом и сервером, предоставляющим REST API:
- Изначально, нам нужно получить от сервера TOKEN. Для этого необходимо предварительно авторизоваться. Здесь можно использовать модификацию протокола CRAM-MD5.
- После получения токена мы можем использовать его для подписи отправляемых нами сообщений: запросов к API и необходимых данных для проверки целостности запроса: HASH, RANDOM, TIMESTAMP.
Кратко опишем эти параметры:- HASH - подпись с применением функций хеширования и формул конкатенации данных запроса.
- RANDOM - случайная строка символов или число для создания уникального запроса
- TIMESTAMP - контроль давности запроса на стороне сервера.