Как я могу защитить онлайн-API для своего приложения?

Я создаю приложение для Windows Phone и Android. Так что прямо сейчас я создаю webapi, который они оба могут использовать, но я хочу защитить его som, а не другие, которые могут использовать мои приложения. Как мне это сделать? Никто, кроме моих приложений, не получит доступ к этим API.

 *Я не хочу реализовывать OAuth.* 

Я имею два сценария, о которых я думаю:

**First** (I store username and hashed password on the client):

* basic-auth через https/ssl, thats it.

**Second** (I store accesstoken on the client):

* basic-auth через https/ssl для получения токена доступа.
* , чтобы получить токен доступа, пользователь отправляет запрос для запроса, открывая токен, который проверяет, что и клиент, и сервер знают, что происходит с клиентами.
* для каждого вызова API, который должен быть отправлен accesstoken для проверки доступа

Проблема, поскольку я вижу второй подход, заключается в том, что сервер отправляет accesstoken клиенту, если кто-то, где получить это, будет иметь доступ к пользователю.

Как это делается в реальном мире?

Вы можете использовать небольшую модификацию  **First** :

* сохранить имя пользователя и  *пароль*  на клиенте
* basic-auth over https

Хранение пароля  *hash*  на клиенте, а затем передача хэша и сравнение его с хэшем в базе данных эквивалентно сохранению в текстовом пароле обычного текста, поскольку  **хеш становится паролем . Итак, ваши приложения должны аутентифицироваться с именем пользователя и паролем, как это сделал бы любой пользователь.**

**Но ваши опасения по поводу второго подхода также применяются. Если кто-то перехватывает сообщение, он имеет ваши полномочия.

Более безопасное решение  **аутентификация HMAC**  (теперь мы говорим «реальный мир»).

* пользователь имеет секретный ключ , который хранится на сервере и клиенте
* каждый запрос получает канонизацию (преобразуется в отдельную строку, содержащую метод запроса, URI, параметры и временную метку)
* канонизированный запрос получает хэширование с помощью HMAC с использованием секретного ключа, хэш и идентификатор пользователя передаются в заголовке HTTP  `Authorization`
* на сервере хэш генерируется с использованием того же алгоритма (с меткой времени из заголовка HTTP  `Date` ) и сравнивается с отправленным хешем.
* Если результаты равны, запрос аутентифицируется

Примером может служить  **[API-интерфейс Amazon S3 REST](https://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html)**  - связанная документация также является хорошим примером того, как реализовать ее для вашего собственного API.**