Веб-служба REST и ключи API

У меня есть веб-сервис, который я предлагаю пользователям подключиться к моей базе данных приложений и получить некоторую информацию. Пользователи должны зарегистрироваться для получения ключа API и предоставлять его при отправке запросов. Все работает нормально, но как мне проверить, действительно ли пользователи, которые зарегистрировались для получения ключа, делают запрос, а не кто-то другой, кому он мог дать ключ?

Я думал последние два дня, чтобы придумать решение, но пока ничего.


person slash197    schedule 14.06.2012    source источник
comment
Используете ли вы JAVA или PHP (или что-то еще)?   -  person sp00m    schedule 14.06.2012
comment
Как ответил @Laurent, вы могли бы взглянуть на процесс OAuth, но я бы предложил OAuth2. Даже если пост немного устарел, вы найдете здесь реализацию этого механизма на PHP. PS: Google и Facebook используют OAuth2, чтобы разработчики могли взаимодействовать со своим API.   -  person sp00m    schedule 14.06.2012
comment
Насколько я понимаю: вас беспокоит аутентификация как таковая или возможность того, что пользователь может поделиться своими данными аутентификации с другими?   -  person jmclem    schedule 18.06.2012


Ответы (2)


Вам нужно использовать подписанные запросы. В основном это работает так:

  • Вы даете пользователю ключ API и "секрет" (случайную строку), который знаете только вы и клиент.
  • Всякий раз, когда они делают запрос, они добавляют к нему параметр «подпись». Эта подпись представляет собой хэш параметров запроса + ключ API + другие параметры (см. ниже) + секрет.
  • Поскольку вы тоже знаете секрет, вы можете проверить правильность подписи.

Чтобы избежать повторных атак, вы также можете добавить в микс одноразовые номера и временные метки. Nonce — это просто число, которое клиент должен увеличивать при каждом запросе. Когда вы получаете запрос, вы проверяете, получали ли вы этот одноразовый номер/отметку времени ранее. Если вы это сделали, вы отклоняете запрос (поскольку это, скорее всего, повторная атака). Если нет, вы сохраняете одноразовый номер/метку времени в своей базе данных, чтобы вы могли найти ее позже.

Примерно так подписываются запросы в OAuth. Посмотрите на их пример по ссылке.

person laurent    schedule 14.06.2012
comment
Спасибо! Звучит интересно, я должен проверить это. - person slash197; 14.06.2012
comment
Если пользователь выдаст свой секретный ключ, вы все равно не сможете должным образом подтвердить его личность. Политика (а не технология) должна диктовать надлежащее использование ключа API и секретного ключа. Тем не менее, это хорошая информация. В каком сценарии будет применяться повторная атака — анализ трафика (ключ/параметры API) или угадывание параметров запроса? - person KyleM; 25.02.2014
comment
@KyleM, да, это для предотвращения атак MITM. Я думаю, это менее важно, если соединение осуществляется через https (как и должно быть). - person laurent; 07.12.2016

Аутентификация вызовов REST API состоит из двух частей. Когда пользователь регистрируется в вашей службе, вы обычно назначаете КЛЮЧ, идентифицирующий этого пользователя. Иногда этого достаточно. Но этот КЛЮЧ можно передать или украсть. В этом случае ваша служба по-прежнему будет считать КЛЮЧ действительным. Теперь, чтобы предотвратить перехват ключей и т. д., вы также будете распространять секретный ключ. Этот ключ никогда не передается с запросом REST API. Этот ключ используется для выполнения одностороннего хэширования запроса API и создания подписи (HMAC).

Эта подпись, а также запрос API (HTTP-запрос в форме URL-адреса) затем отправляются на сервер API. Сервер выполняет одностороннее хеширование URL-адреса и сравнивает его с подписью, используя закрытый ключ этого пользователя. Если они совпадают, «предполагается», что запросчик имеет доступ к закрытому ключу, и, следовательно, запрос действителен.

Чтобы избежать повторных атак, в дополнение к одноразовому номеру (как было предложено предыдущим постером), вы также можете использовать цепочку хэшей.

person Kingz    schedule 24.02.2014