Как реализовать аутентификацию для веб-приложений RESTful? - PullRequest
2 голосов
/ 08 декабря 2011

Я пишу веб-приложение на JavaScript (клиент) и Python / Google App Engine (сервис), где я хочу, чтобы пользователи добавляли свои данные. Я создал страницу приветствия, в которой будет поле для входа / регистрации. После ввода правильного имени пользователя / пароля я хочу, чтобы пользователь был авторизован, а затем переадресован на страницу веб-приложения и заставил пользователя отправлять запросы AJAX службе RESTful с указанным идентификатором пользователя, т.е. и на стороне обслуживания убедитесь, что пользователь авторизован.

Как мне этого добиться и сделать все безопасно (т.е. никогда не отправлять имя пользователя / пароль в открытом тексте)? Я нашел несколько «модных слов», таких как «HTTP-аутентификация» и «сеансы», но не смог найти надежную и понятную статью о том, как реализовать подобные вещи.

Мне также интересно, как разные популярные сайты обрабатывают авторизацию (то есть GMail работает по HTTPS; Stackoverflow и Facebook, похоже, используют HTTP).

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

Я не фанат повторного изобретения колеса, поэтому я бы порекомендовал вам либо использовать встроенную интеграцию учетных записей Google (или OpenID), которая есть в GAE, либо использовать аутентификацию пользователя Django.

Аккаунты Google / OpenID на GAE python: http://code.google.com/appengine/docs/python/users/

Аутентификация Django: https://docs.djangoproject.com/en/dev/topics/auth/

Таким образом, у вас есть все необходимое для управления пользователями, а с Django вы также получаете структуру разрешений.

1 голос
/ 08 декабря 2011

По сути, вы хотите сеанс. Когда пользователь входит на сервер, он возвращает ему уникальный токен, который указывает сеанс или пользователя в системе. Всякий раз, когда пользователь делает следующий запрос, он передает токен, чтобы сервер мог проверить его и убедиться, что ему разрешено делать то, что он пытается сделать.

В веб-приложении вы обычно создаете сеанс на стороне сервера и возвращаете токен в виде файла cookie. Браузер пользователей будет автоматически отправлять этот токен на сервер при каждом запросе, чтобы сервер мог видеть, что пользователь аутентифицирован. Это то, что делают Gmail, Stack Overflow и Facebook (и почти каждый веб-сайт).

Если вы хотите использовать файлы cookie для этого в GAE, вы можете использовать встроенную пользовательскую систему Google, и она автоматически создаст сеанс и файл cookie, и все, что вам нужно сделать, это использовать API пользователей, чтобы выяснить, кто вошел в систему ( см. пример пользователей в документации GAE). Если вы не хотите использовать пользовательскую систему Google (потому что не хотите, чтобы у ваших пользователей была учетная запись Google), вы можете запустить свою собственную систему сеансов или использовать установленную библиотеку, такую ​​как GAE-Sessions (https://github.com/dound/gae-sessions). пример кода на этом сайте о том, как его использовать.

За исключением: RESTful API, которые не используются строго веб-браузерами, часто не используют куки для аутентификации. Они либо создают токен для каждого пользователя заранее (при создании пользователя), либо когда пользователь входит в систему (передает токен в ответ на запрос входа в систему), и пользователь передает этот токен серверу в своих запросах как либо параметр, либо как заголовок HTTP.

В обоих вышеперечисленных случаях вы могли бы выполнить вход через HTTPS, а остальные действия - через HTTP, и это сработало бы без каких-либо дополнительных усилий с вашей стороны, однако токен, передаваемый на сервер от клиента, будет отправлен небезопасно по HTTP, что плохо. Многие системы сессий будут отслеживать, к какому IP-адресу относится сессия, поэтому, если кто-то попытается перехватить сессию, скопировав свой токен, в который он не сможет войти, но, если у вас нет веских причин не делать этого, вам следует просто использовать HTTPS для всего.

...