Прежде всего, я предлагаю вам прочитать эту прекрасную статью: http://piwik.org/blog/2008/01/how-to-design-an-api-best-practises-concepts-technical-aspects/
Решение очень простое.Это комбинация Flickr-подобного API (на основе токенов) и метода аутентификации, используемого paiement gateway Я использую (очень безопасный), но вместо этого с личным паролем / солью.
Для предотвращениянеавторизованным пользователям использовать API без необходимости отправлять пароль в запросе (в моем случае, в открытом виде, поскольку SSL не существует), они должны добавить подпись , которая будет состоять из хеширования MD5 объединения частных и общедоступных значений:
- Хорошо известные значения, такие как имя пользователя или даже маршрут API
- Пропуск пользователя
- Aуникальный код, сгенерированный пользователем (может использоваться только один раз)
Если мы запросим / api / route / и пароль будет kdf8 * s @ , подпись будет следующей:
string uniqueCode = Guid.NewGuid().ToString();
string signature = MD5.Compute("/api/route/kdf8*s@" + ticks);
URL-адрес HTTP-запроса будет:
string requestUrl =
string.Format("http://example.org/api/route/?code={0}&sign={1}", uniqueCode, signature);
На стороне сервера вам придется предотвращать любые новые запросы с тем жеуникальный кодЗапрещение любому злоумышленнику просто повторно использовать один и тот же URL в своих интересах.В этой ситуации я хотел избежать.
Поскольку я не хотел хранить код, который использовался пользователем API, я решил заменить его на ticks .Тики представляют собой число интервалов в 100 наносекунд, прошедших с 12:00:00 до полуночи 1 января 0001 года.
На стороне сервера я принимаю тики (метку времени) только с допуском + -3 минуты.(если клиент и сервер не синхронизированы по времени).Это означает, что потенциальный злоумышленник сможет использовать это окно для повторного использования URL-адреса, но не навсегда.Безопасность немного снижена, но все еще достаточно хороша для моего случая.