Why do access tokens expire?

Refresh

November 2018

Views

91.2k time

194

I am just getting started working with Google API and OAuth2. When the client authorizes my app I am given a "refresh token" and a short lived "access token". Now every time the access token expires, I can POST my refresh token to Google and they will give me a new access token.

My question is what is the purpose of the access token expiring? Why can't there just be a long lasting access token instead of the refresh token?

Also, does the refresh token expire?

See Using OAuth 2.0 to Access Google APIs for more info on Google OAuth2 workflow.

4 answers

8

По существу, это мера безопасности. Если ваше приложение будет взломано, злоумышленник будет иметь доступ только к недолговечному маркеру доступа и никоим образом, чтобы генерировать новую.

Обновить лексемы также истекает, но они должны жить гораздо дольше, чем маркер доступа.

4

В дополнение к другим ответам:

После получения, токены доступа, как правило, отправляется вместе с каждым запросом от клиентов к защищенным серверам ресурсов. Это индуцирует риск для доступа маркеров угона и воспроизведения (при условии, конечно, что доступ лексема типа «Знаменосец» (как определенно в начальных RFC6750).

Примеры таких рисков, в реальной жизни:

  • Серверы ресурсов, как правило, распределяются серверы приложений и, как правило, имеют более низкие уровни безопасности по сравнению с серверами авторизации (нижняя SSL / TLS конфигурации, меньше твердения и т.д.). Авторизации серверов, с другой стороны, как правило, рассматриваются в качестве инфраструктуры критической безопасности и подвержены более серьезным твердения.

  • Токены доступа могут отображаться в HTTP следов, журналы и т.д., которые собираются на законных основаниях для диагностических целей на серверах ресурсов или клиентов. Эти следы могут быть обменены по общественным или полу-общественных местах (трассеров ошибка, сервис-стол и т.д.).

  • Backend приложений RS могут быть переданы на более или менее надежные третьи стороны.

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

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

207

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

  • Многие лексемы на предъявителя поддержки провайдеров, которые являются очень слабыми с точки зрения безопасности. Делая их недолговечны и требуют обновлений, они ограничивают время злоумышленник может злоупотреблять украденную фишку.
  • Крупномасштабное развертывание не хочет, чтобы выполнить поиск в базе данных каждого вызов API, так что вместо этого они выдают самостоятельно закодирован маркер доступа, который может быть уточнен дешифрованием. Однако, это также означает, что нет никакого способа, чтобы отменить эти маркеры, чтобы они выдаются в течение короткого времени и должны быть обновлены.
  • Маркер обновления требует проверки подлинности клиента, что делает его сильнее. В отличие от указанных выше маркеров доступа, как правило, реализуется с помощью поиска в базе данных.
27

Несколько сценариев могут помочь проиллюстрировать цель доступа и токены обновления и инженерные компромиссы в проектировании oauth2 (или любую другую аутентификацию) системы:

Сценарий веб-приложение

В сценарии веб-приложения у вас есть несколько вариантов:

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

Давайте представим себе, что кто-то удается захватить вашу сессию. Единственное, что можно, чтобы запросить ваши страницы.

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

Сравнение 1 и 2:

В 1, access_token и refresh_token только путешествовать по проводам на пути между сервером authorzation (Google в вашем случае) и сервер приложений. Это будет сделано по защищенному каналу. Хакер может угнать сессию, но они будут только быть в состоянии взаимодействовать с веб-приложением. В 2, хакер может взять access_token прочь и формировать свои собственные запросы на ресурсы, которые пользователь предоставил доступ. Даже если хакер овладевает в access_token они будут иметь только короткое окно, в котором они могут получить доступ к ресурсам.

В любом случае refresh_token и ClientID / секрет известны только на сервер, что делает его невозможным из веб-браузера, чтобы получить долгосрочный доступ.

Давайте представим, вы реализуете oauth2 и установить длительный тайм-аут на маркер доступа:

В 1) Там нет большой разницы здесь между коротким и длинным маркером доступа, поскольку она скрыта в сервере приложений. В 2) кто-то может получить access_token в браузере, а затем использовать его для прямого доступа к ресурсам пользователя в течение длительного времени.

Мобильный сценарий

На мобильном телефоне, есть несколько сценариев, которые я знаю:

  1. Магазин ClientID / секрет на устройстве и имеет Orchestrate устройства получения доступа к ресурсам пользователей.

  2. Используйте внутренний сервер приложений, чтобы держать ClientId / секрет и это сделать оркестровку. Используйте access_token как своего рода ключ сеанса и передать его между клиентом и сервером приложений.

Сравнение 1 и 2

В 1) После того, как вы ClientId / секрет на устройстве они не являются секретными больше. Любой человек может декомпилировать, а затем начать действовать, как если бы они вам, с разрешения пользователя, конечно. Access_token и refresh_token также в памяти и могут быть доступны на зараженном устройстве, которое означает, что кто-то может действовать в качестве приложения без ведома пользователя, давая свои полномочия. В этом случае длина access_token не имеет никакого значения для hackability поскольку refresh_token находится в том же месте, как access_token. В 2) ClientID / секрет, ни маркер обновления скомпрометированы. Здесь длина access_token истечения определяет, как долго хакер может получить доступ к ресурсам пользователей, они должны получить ее.

длины экспирации

Здесь все зависит от того, что вы обезопасили с вашей системой Идента, как долго ваш access_token экспирация должна быть. Если это то, что особенно ценно для пользователя должно быть коротким. Что-то менее ценное, что может быть больше.

Некоторые люди, как Google не истекают в refresh_token. Некоторые, как stackflow сделать. Решение по истечению является компромиссом между пользователем легкостью и безопасностью. Длина маркеров обновления связана с длиной возвращения пользователя, то есть установить обновление, как часто пользователь возвращается к приложению. Если маркер обновления не истекают единственный способ, которым они отозваны это с явным REVOKE. Как правило, журнал на не отменит.

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