Почитайте как сделать правильно REST API (для POST и не только).
- HASH - подпись с применением функций хеширования и формул конкатенации данных запроса.
- RANDOM - случайная строка символов или число для создания уникального запроса
- TIMESTAMP - контроль давности запроса на стороне сервера.
Кратко: нужно три дополнительных параметра (кроме параметров запроса к API): HASH, RANDOM, TIMESTAMP.
HASH - формируем по TOKEN'у (его мы получаем заранее от сервера) на основе всех данных, передаваемых при запросе к API: API-параметры, RANDOM и TIMESTAMP.
Проверяем подпись при получении запроса и сравниваем с HASH: если подпись равна HASH - исполняем запрос.
UPD: про домен (доп.вариант проверки):
Входные данные, которым мы хотим доверять:
1. Доменное имя клиента API: домен_ожидаемый
2. TXT-запись домена клиента API: TXT_запись_ожидаемая
Имеющиеся данные (при получении запроса к API от клиента):
3. IP клиента API: IP(1)
При инициализации новой сессии (перед формировании нового токена), можно делать 3-4 DNS-запроса к любому публичному DNS-серверу (перед непосредственной генерацией токена!):
1. reverse_lookup (IP(1) клиента API в имя домена(1)) => узнали домен(1).
2. lookup (домен(1) в IP(2) по A-записи) => узнали IP(2)
3. снова reverse_lookup (IP(2) в имя домена(2)).
4. По желанию: можно проверить наличие нужных TXT-записей (и любых других) и сравнить с ожидаемыми (т.н., "статический публичный токен").
После получения всех данных, проверяем:
Домен_ожидаемый===домен(1) && IP(1)===IP(2) && домен(1)===домен(2) && TXT_запись_ожидаемая===TXT_запись_полученная
Если выражение истинно, то выписываем токен на обратившийся клиентский IP для предоставления доступа этому клиенту для начала работы с нашим API.