У меня возникли проблемы с решением, как реализовать аутентификацию для RESTful API, который будет безопасен для использования как веб-приложением, так и мобильным приложением.
Во-первых, я подумал исследовать базовую аутентификацию HTTP через HTTPS в качестве опции. Это будет хорошо работать для мобильного приложения, где имя пользователя и пароль могут храниться в цепочке ключей ОС надежно и не могут быть перехвачены при передаче, поскольку запрос будет передаваться по HTTPS. Это также элегантно для API, так как оно будет полностью без сохранения состояния. Проблема с этим для веб-приложения. Не будет доступа к такой цепочке для ключей для хранения имени пользователя и пароля, поэтому мне нужно будет использовать cookie или localStorage, но тогда я храню личные данные пользователя в легкодоступном месте.
После дополнительных исследований я нашел много разговоров об аутентификации HMAC. Проблема, с которой я сталкиваюсь при таком подходе, заключается в том, что должен быть общий секрет, который знают только клиент и сервер. Как я могу получить этот секрет для каждого пользователя в веб-приложении, если у меня нет конечной точки api/login, которая берет имя пользователя/пароль и возвращает секрет для сохранения в файле cookie? использовать в будущих запросах. Это представляет состояние API, однако.
Чтобы добавить еще один гаечный ключ к работе, я хотел бы иметь возможность ограничить API для определенных приложений (или, чтобы иметь возможность блокировать определенные приложения от использования API). Я не понимаю, как это было бы возможно, если бы веб-приложение было полностью общедоступным.
Я действительно не хочу реализовывать OAuth. Это, вероятно, излишне для моих нужд.
Мне кажется, что я не совсем понимаю HMAC, поэтому я хотел бы получить объяснение и узнать, как можно безопасно реализовать его с помощью веб-приложения и мобильного приложения.
Обновить
В итоге я использовал HTTP Basic Auth, однако вместо предоставления действительного имени пользователя и пароля при каждом запросе была реализована конечная точка для обмена именем пользователя и паролем на ключ доступа, который затем предоставляется для каждого аутентифицированного запроса. Устраняет проблему сохранения имени пользователя и пароля в браузере, но, конечно, вы все равно можете получить токен, если у вас есть доступ к компьютеру и его использование. Оглядываясь назад, я бы, вероятно, посмотрел на OAuth дальше, но это довольно сложно для начинающих.