Я предполагаю, что "токен" в этом случае просто
должен быть либо зашифрованной строкой
что клиент может расшифровать или некоторые
случайная строка, которая сохраняется
где-то (то есть база данных), что
клиент может затем проверить, но
Я не совсем уверен, что клиент
затем предполагается сделать с токеном или
зачем вообще нужен токен -
не мог простой идентификатор пользователя также
хватает?
Нет - токен - это «билет на поездку». Так же, как жетон метро. Клиент представляет его привратнику при запросе услуги. В этом случае провайдер выполняет свою собственную аутентификацию, поэтому клиент представляет маркер обратно провайдеру. В некоторых случаях провайдер может делегировать аутентификацию - например, в модель STS , и в этом случае провайдер может передать токен третьей стороне для аутентификации и даже авторизации.
С точки зрения сервиса этот токен должен:
- имеют «срок годности». В противном случае токен будет бесконечно многократно использоваться. Таким образом, на стороне сервера вы можете хранить токен в хранилище на основе сеансов, где вы получите бесплатное время ожидания. Или вы можете создать простую хеш-таблицу с истечением срока действия.
- быть связанным исключительно с владельцем. Во многих случаях провайдер использует здесь приближение и утверждает, что токен можно использовать только с исходного запрашивающего IP-адреса.
Таким образом, на шаге 3 провайдер должен проверить имя пользователя и пароль. Если это подтверждает, то создайте токен (хэш), который ссылается на запись в словаре или хэш-таблице. Объекты в Hashtable - это структуры, содержащие имя пользователя, IP-адрес, вероятно, исходное время выдачи, возможно, роли, связанные с именем пользователя, и все, что вы хотите сохранить. Поставщик услуг отправляет обратно этот токен - хэш, а не структуру - клиенту, как правило, в виде файла Set-Cookie. Когда клиент отправляет токен обратно (в виде Cookie) при последующих запросах, провайдер проверяет словарь, чтобы узнать, доступен ли токен, не истек ли тайм-аут, соответствует ли запрашивающий IP-адрес, авторизован ли для запрошенного ресурса и т. Д. все в порядке, соблюдайте просьбу.
РЕДАКТИРОВАТЬ 2013 Июнь
Прошло уже несколько лет, и этот ответ все еще набирает голоса.
Я бы посоветовал людям взглянуть на OAuth 2.0 Framework и токены Bearer.
В основном они делают именно то, что описано здесь.
Если вам нужен хороший пример реализации, вы можете посмотреть на UserGrid Apigee. Это работает следующим образом:
Пользователь аутентифицируется
POST https://api.usergrid.com/token -d '{"username":"Joe","password":"Sec4et!","grant_type" : "password"}'
Пользователь получает access_token в ответ
Пользователь делает последующие вызовы с заголовком Authorization: Bearer XXXXXXXXXX
, где XXXXX заменяется токеном-носителем. Этот токен имеет время жизни, установленное сервером пользовательской сетки.