какой смысл обновлять токен?

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

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

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


person wangii    schedule 22.05.2012    source источник
comment
stackoverflow.com/questions/3487991/   -  person Anders Lindahl    schedule 22.05.2012
comment
токен обновления НЕ предназначен для обновления роли пользователя или отмены доступа, а также для запроса пользователя / пароля только в первый раз. Вы можете добиться всего этого с помощью только токена доступа. В основном речь идет об уменьшении количества атак. Дополнительную информацию см. здесь   -  person Honey    schedule 15.08.2019


Ответы (4)


Указанный ответ (через @Anders) полезен, в нем говорится:

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

Я думаю, что важной частью является то, что токены доступа часто регистрируются (особенно при использовании в качестве параметра запроса, что полезно для JSONP), поэтому лучше всего, чтобы они были недолговечными.

Существует несколько дополнительных причин широкомасштабного внедрения OAuth 2.0 поставщиками услуг:

  1. Серверы API могут безопасно проверять токены доступа без поиска в БД или вызовов RPC, если можно не беспокоиться об отзыве. Это может иметь значительные преимущества в производительности и снизить сложность серверов API. Лучше всего, если вы согласны с отзывом токена за 30-60 минут (или любой другой длины токена доступа). Конечно, серверы API также могут хранить в памяти список токенов, отозванных за последний час.

  2. Поскольку токены могут иметь несколько областей действия с доступом к нескольким различным службам API, наличие недолговечных токенов доступа не позволяет разработчику службы API получить пожизненный доступ к данным пользователя в службе API B. Компартментализация хороша для безопасности.

person Ryan Boyd    schedule 24.05.2012
comment
Благодарю. однако я думаю, что обеих дополнительных причин недостаточно. 1, для крупных сайтов с миллионами приложений невозможно сохранить все access_tokens в памяти, поиск в базе данных или вызовы rpc неизбежны. конечно, у меня нет данных, подтверждающих мой аргумент. 2, я думаю, что объем токенов доступа такой же, как и у токенов обновления, по крайней мере, в реализации Google. поэтому перекрестная атака невозможна даже в случае утечки токена обновления. - person wangii; 24.05.2012
comment
Я думаю, что лучше избежать регистрации токенов доступа, но только в том случае, если сайт A авторизован пользователем B для доступа к информации от эмитента C, и каким-то образом токен отправляется четвертой стороне. мне кажется, это происходит, если сайт A размещен на сервере четвертой стороны ... но если у четвертой стороны есть полный доступ к серверу, это все равно бессмысленно, верно? - person wangii; 24.05.2012
comment
@wangii - Re # 1 - токены доступа могут быть самопроверяемыми с использованием шифрования или подписей, поэтому нет необходимости в поиске в БД или вызовах RPC. Токены обновления могут оставаться непрозрачными и могут быть отозваны у поставщика OAuth. По № 2 - Да, объем токенов доступа такой же. Однако предоставить разработчику службы (A) пожизненный доступ к данным пользователя в службе (B) намного хуже, чем предоставить им доступ только тогда, когда пользователь активно использует службу (A). - person Ryan Boyd; 25.05.2012
comment
Я этого не понимаю. Вам также необходимо проверить токен обновления для db / session, сделав его с отслеживанием состояния. Кроме того, вам необходимо зашифровать токен обновления перед его сохранением и проверить его по черному списку, что вызовет дополнительные накладные расходы. Учитывая недолговечный токен доступа, вам, возможно, придется часто выполнять эту проверку ... не могли бы вы уточнить? - person html_programmer; 11.06.2017
comment
@KimGysen, извини, я не уверен, какая часть тебе не достанется. Токен обновления необходимо проверять либо по базе данных, либо по списку отзыва, но идея состоит в том, что токен доступа будет использоваться много раз для каждого обновления. (т. е. XX или XXX запросов API. - person Ryan Boyd; 17.07.2017

Я читал статья, написанная на днях Тайсером Джуде, и я считаю ее очень полезной, он сказал:

На мой взгляд, использование токенов обновления дает три основных преимущества:

  1. Обновление содержимого токена доступа: поскольку вы знаете, что токены доступа являются самодостаточными токенами, они содержат все утверждения (информацию) об аутентифицированном пользователе после их создания, теперь, если мы выпустим долгоживущий токен (например, 1 месяц) для пользователя назвал «Алекс» и зарегистрировал его в роли «Пользователи», после чего эта информация будет содержаться в токене, который сгенерировал сервер авторизации. Если позже (через 2 дня после того, как он получил токен) вы решили добавить его в роль «Администратор», тогда нет возможности обновить эту информацию, содержащуюся в сгенерированном токене, вам необходимо попросить его повторно аутентифицировать себя снова. поэтому сервер авторизации добавляет эту информацию к этому вновь сгенерированному токену доступа, что в большинстве случаев невозможно. Возможно, вы не сможете связаться с пользователями, которые получили долгоживущие токены доступа. Итак, чтобы преодолеть эту проблему, нам нужно выпустить недолговечные токены доступа (например, 30 минут) и использовать токен обновления для получения нового токена доступа, как только вы получите новый токен доступа, сервер авторизации сможет добавить новое утверждение для пользователя. «Alex», который назначает ему роль «Admin» после создания нового токена доступа.

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

  3. Нет необходимости хранить или запрашивать имя пользователя и пароль: использование токенов обновления позволяет вам запрашивать у пользователя его имя пользователя и пароль только один раз, когда он аутентифицируется в первый раз, тогда сервер авторизации может выдать очень долгоживущий токен обновления (1 год для пример), и пользователь останется в системе все это время, если системный администратор не попытается отозвать токен обновления. Вы можете думать об этом как о способе автономного доступа к ресурсам сервера, это может быть полезно, если вы создаете API, который будет использоваться клиентским приложением, где невозможно продолжать часто запрашивать имя пользователя / пароль.

person Kiarash    schedule 05.03.2015
comment
Почему бы не использовать кратковременный токен доступа, в котором учетные данные проверяются по истечении срока его действия? Если пользователь все еще действителен, сбросьте истечение срока действия токена доступа. Я не понимаю необходимости токена обновления? - person Rick Jolly; 16.05.2017
comment
... они содержат все утверждения (информацию) об аутентифицированном пользователе после того, как они сгенерированы ... И здесь я подумал, что размещение любой информации, связанной с пользователем, даже если она зашифрована, в токен, считается плохой практикой. - person bklaric; 04.12.2017
comment
Ну, это зависит от того, о какой пользовательской информации вы говорите. В нем указано, что вся информация о претензиях, а не вся информация о пользователе - person Kiarash; 06.12.2017
comment
@RickJolly: токены доступа обычно содержат достаточно информации, чтобы идентифицировать пользователя и его роль, без необходимости обращаться к базе данных. Обычно это достигается с помощью подписанного и зашифрованного токена (например, подписи hmac). Один символ, добавленный, удаленный или измененный в исходном содержимом, дает вам совершенно другой подписанный токен. Итак, если после подписания и шифрования идентификатора пользователя: alex; role: user; client: foobar.com; ts: 1552806134 токен выглядит как «kE4ia6», он будет выглядеть совершенно иначе для идентификатора пользователя: alex; role: admin; client: barbaz.net ; ts: 1552806565, даже если это тот же пользователь. - person Michael Ekoka; 17.03.2019
comment
@RickJolly: токен обновления - это просто непрозрачный ключ, указывающий на одного пользователя. Вам необходимо каждый раз запрашивать базу данных, чтобы определить, кому она принадлежит (снижение производительности). По сути, это запутанное представление учетных данных пользователя. Таким образом, вместо того, чтобы хранить имя пользователя: пароль на вашем клиенте, вы можете сохранить его (лучшая практика). В новом проекте вы можете использовать его так же, как токен доступа, но из-за вышеупомянутых ограничений вам может потребоваться что-то более масштабируемое. Настройка токена обновления / токена доступа - хороший вариант. - person Michael Ekoka; 17.03.2019

Я хотел бы добавить к этому еще одну точку зрения.

Аутентификация без сохранения состояния без обращения к БД при каждом запросе

Предположим, вы хотите создать механизм безопасности без сохранения состояния (без сеанса), который может выполнять аутентификацию миллионов пользователей без необходимости выполнять вызов базы данных для аутентификации. Со всем трафиком, который получает ваше приложение, сохранение вызова БД при каждом запросе дорого стоит! Кроме того, он не должен иметь состояния, чтобы его можно было легко кластеризовать и масштабировать до сотен или даже тысяч серверов.

В старомодных сеансах пользователь входит в систему, и в этот момент мы считываем информацию о пользователе из базы данных. Чтобы не читать его снова и снова, мы сохраняем его в сеансе (обычно в памяти или в каком-то кластерном кеше). Мы отправляем клиенту идентификатор сеанса в файле cookie, который прикрепляется ко всем последующим запросам. В последующих запросах мы используем идентификатор сеанса для поиска сеанса, который, в свою очередь, содержит информацию о пользователе.

Поместите информацию о пользователе прямо в токен доступа

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

Нет сеанса ... нет возможности банить пользователей?

Но отсутствие сеанса имеет большой недостаток. Что, если этого пользователя забанят, например? В старом сценарии мы просто удаляем его сеанс. Затем он должен снова войти в систему, что он не сможет сделать. Запрет завершен. Но в новом сценарии сеанса нет. Так как же мы можем его забанить? Нам придется попросить его (очень вежливо) удалить его токен доступа. Проверять каждый входящий запрос на список запретов? Да, сработает, но теперь мы снова должны сделать тот вызов БД, который нам не нужен.

Компромисс с недолговечными токенами

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

person Stijn de Witt    schedule 24.10.2016
comment
Но по истечении срока их действия пользователю потребуется предоставить токен обновления, чтобы получить новый токен доступа. Зачем нужен токен обновления? Почему бы не повторно проверить пользователя на основе учетных данных в исходном токене, а затем, если он действителен, сбросить дату истечения срока действия этого токена? - person Rick Jolly; 16.05.2017
comment
@RickJolly Поскольку токен доступа обычно не содержит учетных данных (как и токен обновления). Это работает так, что токены подписываются эмитентом. Таким образом, эмитент знает, что токены действительны (до истечения срока их действия). Обычно токен содержит такие данные, как имя пользователя и роли / разрешения, которые есть у пользователя. Обе стороны могут затем использовать токен для отображения такой информации без необходимости сначала выполнять DB / сетевые вызовы. - person Stijn de Witt; 16.05.2017
comment
Хорошо, спасибо, но если мы проигнорируем то, что я написал о повторной валидации пользователя на основе учетных данных в токене доступа (что может быть просто проверкой того, что идентификатор пользователя все еще разрешен), я все еще не вижу причин для токена обновления. И это мой вопрос: зачем нужен токен обновления? - person Rick Jolly; 16.05.2017
comment
@RickJolly Точка взята. Я предполагаю, что разработчики протокола пришли к выводу, что проще всего разделить две задачи: предоставить токен доступа для всех действий и предоставить токен обновления только для получения токена доступа. Это возлагает ответственность за обновление в руки клиентов, уменьшая сложность для сервера. - person Stijn de Witt; 16.05.2017

Краткий возможный ответ:

Маркеры обновления допускают ограниченное / различное время спада маркеров. Фактические маркеры ресурсов недолговечны, тогда как маркер обновления может оставаться действительным в течение многих лет (мобильные приложения). Это обеспечивает лучшую безопасность (токены ресурсов не нужно защищать) и производительность (только API токенов обновления должен проверять достоверность по БД).

person B M    schedule 05.08.2016