Ключи API можно использовать для контроля частоты запросов, если они видны. Это означает, что вы не будете разрешать более N запросов в минуту на ключ на ip или что-то в этом роде. Они на самом деле не средство безопасности, а личность.
Теперь, как вы убедитесь, что этот ключ действительно используется пользователем, которому он принадлежит?
Один из способов сделать это - подпись запроса. когда вы передаете запрос с набором параметров (a = x & b = y ...), вы создаете подпись, которую может создать или проверить только клиент и сервер. это делается путем взятия параметров и значений и создания их суммы MD5 или SHA1, добавления в строку секретной переменной или соли. эта переменная никогда не отправляется по проводам и видна пользователю через консоль администратора только через https. Обязательно сортируйте параметры в алфавитном порядке, прежде чем хэшировать!
Итак, если мои параметры: foo=bar&bar=baz
, я сортирую словарь параметров, добавляю секрет $SECRET='asd32efe32ef2df23'
и создаю: $sig = md5('bar=baz&foo=bar'.$SECRET);
, затем могу просто добавить &sig={$sig}
к запросу. другая сторона сделает то же самое с параметрами (исключая sig
) и проверит его.
Хорошей идеей было бы изменить секрет за сеанс или время от времени. это можно сделать по протоколу HTTPS, используя пароль или сертификат SSL.
Edit: одна вещь, которую вы обычно добавляете, чтобы сделать ее более безопасной, - это инкрементный идентификатор запроса, который также отправляется в незашифрованном виде по проводам и используется в процессе хеширования. это препятствует тому, чтобы два идентичных запроса имели одинаковую подпись, и предотвращает повторную атаку (злоумышленник повторно отправляет команду). Когда вы делаете это, вам нужно разрешить некоторую отсрочку на сервере для запросов не по порядку (то есть клиент отправил их по заказу, но из-за скорости сети вы можете видеть их как 100, 102, 101 на сервере).