Сервис-аутентификация с использованием токенов - PullRequest
13 голосов
/ 02 июня 2009

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

  1. Клиент запрашивает у пользователя имя пользователя / пароль
  2. Клиент передает имя пользователя / пароль провайдеру идентификации
  3. Провайдер проверяет имя пользователя / пароль и отправляет обратно токен, если пользователь действителен
  4. Клиент что-то делает с токеном?

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

Ответы [ 5 ]

25 голосов
/ 02 июня 2009

Я предполагаю, что "токен" в этом случае просто должен быть либо зашифрованной строкой что клиент может расшифровать или некоторые случайная строка, которая сохраняется где-то (то есть база данных), что клиент может затем проверить, но Я не совсем уверен, что клиент затем предполагается сделать с токеном или зачем вообще нужен токен - не мог простой идентификатор пользователя также хватает?

Нет - токен - это «билет на поездку». Так же, как жетон метро. Клиент представляет его привратнику при запросе услуги. В этом случае провайдер выполняет свою собственную аутентификацию, поэтому клиент представляет маркер обратно провайдеру. В некоторых случаях провайдер может делегировать аутентификацию - например, в модель STS , и в этом случае провайдер может передать токен третьей стороне для аутентификации и даже авторизации.

С точки зрения сервиса этот токен должен:

  • имеют «срок годности». В противном случае токен будет бесконечно многократно использоваться. Таким образом, на стороне сервера вы можете хранить токен в хранилище на основе сеансов, где вы получите бесплатное время ожидания. Или вы можете создать простую хеш-таблицу с истечением срока действия.
  • быть связанным исключительно с владельцем. Во многих случаях провайдер использует здесь приближение и утверждает, что токен можно использовать только с исходного запрашивающего IP-адреса.

Таким образом, на шаге 3 провайдер должен проверить имя пользователя и пароль. Если это подтверждает, то создайте токен (хэш), который ссылается на запись в словаре или хэш-таблице. Объекты в Hashtable - это структуры, содержащие имя пользователя, IP-адрес, вероятно, исходное время выдачи, возможно, роли, связанные с именем пользователя, и все, что вы хотите сохранить. Поставщик услуг отправляет обратно этот токен - хэш, а не структуру - клиенту, как правило, в виде файла Set-Cookie. Когда клиент отправляет токен обратно (в виде Cookie) при последующих запросах, провайдер проверяет словарь, чтобы узнать, доступен ли токен, не истек ли тайм-аут, соответствует ли запрашивающий IP-адрес, авторизован ли для запрошенного ресурса и т. Д. все в порядке, соблюдайте просьбу.


РЕДАКТИРОВАТЬ 2013 Июнь

Прошло уже несколько лет, и этот ответ все еще набирает голоса. Я бы посоветовал людям взглянуть на OAuth 2.0 Framework и токены Bearer.

В основном они делают именно то, что описано здесь.

Если вам нужен хороший пример реализации, вы можете посмотреть на UserGrid Apigee. Это работает следующим образом:

  1. Пользователь аутентифицируется

    POST https://api.usergrid.com/token -d '{"username":"Joe","password":"Sec4et!","grant_type" : "password"}'

  2. Пользователь получает access_token в ответ

  3. Пользователь делает последующие вызовы с заголовком Authorization: Bearer XXXXXXXXXX, где XXXXX заменяется токеном-носителем. Этот токен имеет время жизни, установленное сервером пользовательской сетки.

1 голос
/ 02 июня 2009

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

1 голос
/ 02 июня 2009

Эта документация для Amazon S3 показалась мне полезной, когда я изучал ту же проблему.

Аутентификация запросов REST

Основной принцип заключается в том, что вы не хотите передавать свое имя пользователя и пароль для каждого последующего вызова службы, поскольку это не будет таким безопасным.

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

Возможно, вы думаете об использовании состояния сеанса для сохранения факта аутентификации пользователя, однако это противоречит одному из общих принципов REST, согласно которому все должно быть без сохранения состояния.

0 голосов
/ 18 мая 2010

Веб-сервис с сессиями ... хм, это не так, как должно быть. Веб-сервисы не предназначены для сохранения состояния.
Я посмотрел в Интернете, и большинство примеров и статей говорят о SSL / TLS + имя пользователя / пароль. Было бы неплохо заменить имя пользователя / пароль инфраструктурой "API-ключа", но я понятия не имею, как "создать" такую ​​вещь ...

0 голосов
/ 02 июня 2009

Это похоже на то, как Kerberos работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...