RESTful-аутентификация для веб-приложений [закрыто]
Привет уже написал это замечание и вопросэтот вопрос раньше, но только позже заметил, что это был старый и "мертвый" вопрос. Поскольку мне действительно нравятся некоторые идеи от других, я размещаю это как новый вопрос.
К вопросу о том, как сделать аутентификацию RESTful, люди обычно с энтузиазмом кричат «HTTP-аутентификация». Тем не менее, я сомневаюсь, пытались ли эти люди когда-либо делать на основе браузераapplication (вместо межсетевого веб-сервиса) с REST. (не в обиду - я просто не думаю, что они когда-либо сталкивались с осложнениями)
Проблемы, которые я обнаружил при использовании HTTP-аутентификации в сервисах RESTful, которые создают HTML-страницы для просмотра в браузере:
user typically gets an ugly browser-made login box, which is veyr user-unfriendly. you cannot add password retrieval, help boxes, etcetera. logging out or logging in under a different name is a problem - browsers will keep sending authentication information to the site until you close the window timeouts are difficultОчень проницательная статья, которая занимается этими пунктами, являетсяВот, но это приводит кlot специфичного для браузера взлома javascript, обходных путей и так далее. Как таковая, она также не совместима с форвардом, поэтому потребует постоянного обслуживания по мере выпуска новых браузеров. Я не считаю этот чистый и понятный дизайн, плюс я чувствую, что это большая дополнительная работа и головная боль, просто чтобы я мог с энтузиазмом показать мой REST-значок моим друзьям.
Я считаю, что печенье - это решение. Но подождите, печенье - это зло, не так ли? Нет, то, как часто используются файлы cookie, является злом. Сам файл cookie - это просто часть информации на стороне клиента, точно так же, как информация HTTP-аутентификации, которую браузер будет отслеживать при просмотре. И эта часть информации на стороне клиента отправляется на сервер при каждом запросе, как и в случае с информацией HTTP-аутентификации. Концептуально, единственное отличие состоит в том, чтоcontent этой части клиентского состояния может быть определеноserver как часть его ответа.
Делая сессии RESTful-ресурсом только со следующими правилами:
A session maps a key to a user id (and possibly a last-action-timestamp for timeouts) If a session exists, then that means that the key is valid. Login means POSTing to /sessions, a new key is set as a cookie Logout means DELETEing /sessions/{key} (with overloaded POST, remember, we're a browser and HTML 5 is a long way to go yet) Authentication is done by sending the key as a cookie at every request and checking whether the session exists and is validТеперь единственное отличие от HTTP-аутентификации состоит в том, что ключ аутентификации генерируется сервером и отправляется клиенту, который продолжает отправлять его обратно, а не клиенту, который вычисляет его по введенным учетным данным.
Мне кажется, что это достаточное решение, которое прекрасно работает, но я должен признать, что мне недостаточно эксперта по безопасности, чтобы выявить потенциальные дыры в этой схеме - все, что я знаю, - это то, что сотни не-RESTful веб-приложений используют по существу одно и то же протокол входа в систему ($ _SESSION inphp, HttpSession в j2ee и т. д.). Содержимое заголовка cookie просто используется для адресации на стороне сервера, точно так же, как язык accept может использоваться для доступа к ресурсам перевода и так далее. Я чувствую, что это то же самое, но, может быть, другие не так? Что вы думаете, ребята?