Когда мы открываем пользователям доступ к Web-API, нам необходимо убедиться, что каждый вызов API аутентифицирован. Это означает, что мы хотим быть уверенны в том, что пользователь — это пользователь ;).
Мы рассмотрим два распространенных способа:
Аутентификация на основе токенов
Шаг 1 — пользователь вводит свой пароль в клиенте, и клиент отправляет пароль на сервер аутентификации.
Шаг 2. Сервер аутентификации проверяет учетные данные и генерирует токен со сроком действия.
Шаги 3 и 4 — теперь клиент может отправлять запросы к ресурсам сервера с токеном в HTTP-заголовке. Этот доступ действителен до истечения срока действия токена.
Аутентификация HMAC
Этот механизм генерирует подпись с помощью хеш-функции (SHA256 или MD5).
Шаги 1 и 2 — сервер генерирует два ключа: один — публичный идентификатор приложения (открытый ключ), а другой — ключ API (закрытый ключ).
Шаг 3 — теперь мы генерируем подпись HMAC на стороне клиента (hmac A). Эта подпись создается с помощью набора атрибутов (public app ID, ...).
Шаг 4 — клиент отправляет запрос к ресурсам сервера с hmac A в HTTP-заголовке.
Шаг 5 – сервер получает запрос, содержащий данные запроса и заголовок аутентификации. Он извлекает необходимые атрибуты из запроса и использует ключ API, хранящийся на стороне сервера, для создания подписи (hmac B.).
Шаги 6 и 7 — сервер сравнивает hmac A (сгенерированный на стороне клиента) и hmac B (сгенерированный на стороне сервера). Если они совпадают, запрошенный ресурс будет возвращен клиенту.
P.S. Как аутентификация HMAC обеспечивает целостность данных? Почему мы включаем «метку времени запроса» в генерацию подписи HMAC?