Для мобильных клиентов:
1. После запуска приложения — cобираете информацию об устройстве и вашем клиенте (hash-тела, к примеру), шифруете, передаете к себе.
2. На сервере: выписываете ключ доступа именно для этого устройства, формируете salt и сохраняете в БД, возвращаете алгоритм формирования ключа клиенту с примесью salt и временную засечку.
3. Клиент каждый раз при запросе API формирует подпись на основе salt, инф. об устройстве и клиенте (hash-тела).
Если подпись верна и время ответа было менее TIMEOUT, то доступ к API разрешается.
Для WEB (при каждом вызове страницы, где есть взаимодействие с API):
1. Запрос страницы с сервера: сохраняем на сервере: key1, отпечаток времени, контент отправленной страницы клиенту
2. Скрипт клиента со страницы грузит по ajax функцию для вычисления key2 на основе всего исходника страницы используя key1 и сразу же возвращает вычисленное значение (key3) на сервер.
3. На сервере — проверка key3, и если время ответа было менее TIMEOUT, то сервер разрешает доступ к API (обращение к API подписывается key3).
Все варианты конечно же обходятся, но задача значительно усложняется.
Если еще у кого есть более лучшие варианты — с удовольствием почитаю.