Прошу помочь разобраться в вопросе реализации аутентификации в REST

Рейтинг: 0Ответов: 2Опубликовано: 11.04.2015

Привет, всем!

Пишу веб-приложение на Python-е с применением микрофреймворка Flask. Сейчас передо мною стоит задача реализации механизма аутентификации пользователей и выдачи ресурсов только авторизованным пользователям.

Читая ресурсы:

У меня сформировалась "каша" в голове. Прошу поделиться своим опытом.

А пока у меня в голове понимание такое:

  • Приложение должно работать строго по HTTPS
  • Запросы к приложению должны содержать токены
  • Приложение может содержать какой-либо URL вида 'my-service.ru/v1/token' передавая в HTTP POST-запросе username/password можно получить токен с действием на час

Смущает то что передача пароля в открытом виде, пусть даже и по HTTP(S). Но лучшего пока не могу придумать.

Как же все-таки соблюсти Stateless-ограничение и при этом правильно принять credentials от пользователя чтобы выдать ему токен?

UPD: Верно ли что что HTTP аутентификация Digest-типа это сессионный тип аутентификации?

UPD2: Некоторые подробности работы моего приложения:

  • Мое приложение предназначено для работы с "роботами"
  • Я завожу нового пользователя в базу данных о пользователях в ручную и выдаю credentials этому пользователю. Он в свою очередь настраивает своего "робота" для дальнейшей работы в автоматическом режиме без участия человека
  • Весь принимаемый и передаваемый трафик будет шифроваться, по этой причине выбрана работа по HTTP(s)

Ответы

▲ 1

На самом деле в аутентификации для REST нет ничего уникального. Вы работаете через протокол HTTP, у вас те же средства, что и в не-RESTful. "Каша" возникает возможно из-за путаницы терминов аутентификация/идентификация.
Для аутентификации вы посылаете что-то в параметрах запроса: например логин и пароль. В ответе получаете идентификатор доступа - токен, он может быть в куки. Для последующей идентификации клиента в вашем распоряжении заголовки (куки) либо query-параметры запроса, как в любом HTTP приложении.

Вот здесь хорошо рассмотрено в общем виде:
https://stackoverflow.com/a/7158864/272885
и
https://stackoverflow.com/a/20311981/272885

▲ 1

Первое, что следует понимать: безотносительно каркаса, на котором ведётся разработка, в большинстве случаев используются стандартизированные методы аутентификации. В этом плане разница между каркасами только в том, на сколько доступны готовые варианты решения для того или иного типа аутентификации - батарейки. В каркасах с батарейками, часто ваша задача решается тривиально.

Второе: ваше приложение не обязано работать на HTTPS, однако, некоторые типы аутентификации этого требуют или настоятельно рекомендуют (ср. HTTPBasic и OAuth 2).

Третье: должны ли запросы содержать токены зависит от выбранного вами типа аутентификации. Продолжительность жизни токенов тоже зависит от допущений стандарта. С передачей паролей всё ровно также.

И помните, что для тех же OAuth и Basic совершенно не важно, какой именно тип ресурса вы защищаете - выдачу REST или обычную веб-страницу.