Я прочитал немало SO-потоков об аутентификации и авторизации с REST и Angular, но я все еще не чувствую, что у меня отличное решение для того, что я надеюсь сделать. Для некоторого фона я планирую создать приложение в AngularJS, где я хочу поддержать:
- Ограниченный доступ гостей
- Роль-доступ к приложению после аутентификации
- Аутентификация через API
Все вызовы API REST должны выполняться через SSL. Я бы хотел создать приложение без нарушения правил RESTful, а именно не сохранять состояние сеанса на сервере. Конечно, все, что делается с авторизацией на стороне клиента, должно быть усилено на стороне сервера. Поскольку нам нужно передать все состояние с каждым запросом, я знаю, что мне нужно передать какой-то токен, чтобы сервер базы данных, получающий запрос REST, мог аутентифицировать и разрешать вызов.
С учетом сказанного мой главный вопрос касается аутентификации - какие здесь лучшие практики? Кажется, здесь обсуждается множество разных подходов, вот только некоторые из них, которые я нашел:
- http://broadcast.oreilly.com/2009/12/principles-for-standardized-rest-authentication.html
- http://frederiknakstad.com/2013/01/21/authentication-in-single-page-applications-with-angular-js/
- http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
Был задан аналогичный вопрос (аутентификация приложения с использованием метода AngularJS), но если я не ошибаюсь в ответе, это означает, что сеанс сервера должен быть используемый, который нарушает принципы RESTful.
Моя главная забота об Amazon AWS и статье Джорджа Риз, кажется, предполагает, что потребитель - это программа, а не конечный пользователь. Общий секрет может быть выдан программисту заранее, который затем может использовать его для кодирования вызовов здесь. Здесь не так - мне нужно вызвать API REST из приложения от имени пользователя.
Будет ли такой подход достаточным? Скажем, у меня есть ресурс сеанса:
POST/api/session
Создайте новый сеанс для пользователя
Чтобы создать сеанс, вам нужно выполнить POST объект JSON, содержащий "имя пользователя" и "пароль".
{
"email" : "[email protected]",
"password" : "password"
}
Пример скручивания
curl -v -X POST --data '{"username":"[email protected]","password":"password"}' "https://app.example.com/api/session" --header "Content-Type:application/json"
ответ
HTTP/1.1 201 Created {
"session": {
"id":"520138ccfa4634be08000000",
"expires":"2014-03-20T17:56:28+0000"
}
}
Коды состояния
- 201 - Создан, установлен новый сеанс
- 400 - Неправильный запрос, объект JSON недействителен или отсутствует требуемая информация.
- 401 - Несанкционированный доступ, проверка электронной почты/паролей.
- 403 - Доступ запрещен, отключена учетная запись или лицензия недействительна
Я оставляю детали HATEOAS для ясности. На бэкэнд будет создан новый ключ сеанса ограниченного времени, созданный и связанный с пользователем. В последующих запросах я мог передать это как часть заголовков HTTP:
Authorization: MyScheme 520138ccfa4634be08000000
Тогда серверные серверы будут отвечать за переваривание этого из запроса, поиск связанного пользователя и принудительное выполнение правил авторизации для запроса. Вероятно, он должен обновить срок действия сессии.
Если все это происходит через SSL, я оставляю дверь открытой для любых атак, против которых я должен защищаться? Вы можете попытаться угадать ключи сеанса и поместить их в заголовок, поэтому я полагаю, что я мог бы дополнительно добавить GUID пользователя к ключу сеанса, чтобы предотвратить атаки с использованием грубой силы.
Прошло несколько лет с тех пор, как я активно программировал, и я просто возвращаюсь сюда. Извиняюсь, если я тупой или излишне изобретающий колесо, просто надеясь запустить мои идеи сообществом здесь, основываясь на моем чтении до сих пор, и посмотреть, проходят ли они экзамен лакмусовой бумажки.