что значит срок действия токена истек
Каков срок истечения срока действия ID-токена в OpenID Connect?
В OpenID Connect срок действия токена доступа истекает. Для потока кода авторизации это обычно короткое время (например, 20 минут), после чего вы используете токен обновления для запроса нового токена доступа.
У токена ID также есть срок действия. Мой вопрос в том, какова цель этого?
Любое время истечения срока действия токена идентификатора меньше времени истечения срока действия токена обновления будет означать, что в конечном итоге у вас будет просроченный токен идентификатора, но действительный токен доступа.
В спецификации OpenID Connect просто говорится, что при проверке токена идентификатора
Который (возможно) поддерживает третий вариант выше.
ИЗМЕНИТЬ
Поскольку OpenID Connect основывается на OAuth2, ответ на дополнительный вопрос ниже можно найти в спецификации OAuth2 который говорит,
Связанный с этим вопрос заключается в том, что когда вы обмениваете код авторизации на токены, в той же спецификации говорится, что вы можете получить такой ответ, как:
Но к чему в этом случае относится expires_in? Токен доступа, токен обновления или токен идентификатора?
(Для информации IdentityServer3 устанавливает время истечения срока действия токена доступа).
7 ответов
Я отвечаю на свой вопрос, поскольку обнаружил, что некоторые из предположений, лежащих в основе моего вопроса, были неправильными, поэтому здесь легче уточнить, чем переписывать вопрос.
Маркер ID предназначен для доказательства клиенту, что пользователь прошел аутентификацию и кто он в результате.
Когда Клиент получает токен идентификатора, он обычно делает что-то вроде преобразования его в ClaimsIdentity и сохраняет это, например, с помощью файла cookie.
Мое неправильное предположение, когда я задавал вопрос, заключалось в том, что токен идентификатора и токен доступа должны использоваться вместе, и поэтому оба должны иметь действительные даты истечения срока действия. Это неверно по разным причинам:
Например, мобильное приложение может захотеть сообщить серверной службе , кто пользователь, который использует приложение, и это может потребоваться по прошествии короткого периода времени после начальной аутентификации, когда время истечения срока действия ID-токена и, следовательно, его нельзя использовать для надежной аутентификации пользователя.
Таким образом, для любого потока вы изначально получаете идентификатор ID Token, но как его обновить? Раздел 12 OIDC: Использование токенов обновления содержит следующее заявление о Обновить ответ токена:
Таким образом, срок действия токена ID кажется естественным, но prompt=none гарантирует, что новый токен ID может быть получен плавно без вмешательства пользователя (если, конечно, пользователь не вышел из этого OpenID).
Потребитель id_token должен всегда проверять его (временную) действительность.
В потоке кода вы вызываете конечную точку авторизации OP и получаете код авторизации (также называемый токеном авторизации, или authcode для краткости). Он должен истечь, как и id_token, который вы получили в неявном потоке, по тем же причинам и не может и не должен обновляться.
Затем ваш пользовательский интерфейс или приложение вызывает конечную точку токена OP и получает (иногда после дальнейшего согласия пользователя через пользовательский интерфейс, чтобы разрешить использование принадлежащих им ресурсов на сервере OP):
Вы можете обновить этот access_token, поскольку он только сообщает API, какие утверждения есть у пользователя и какие ресурсы (по областям действия и утверждениям каждой области) пользователь согласился предоставить вам. Как объяснялось выше, это необходимо для разрешения доступа даже после того, как пользователь больше не вошел в систему. Конечно, вы никогда не хотите разрешать обновление id_token, потому что вы не хотите разрешать олицетворение без входа в систему.
Я хотел опубликовать этот ответ в качестве комментария, но, поскольку я не был очень активен в StackOverflow, думаю, я публикую его как альтернативный ответ.
Прежде чем доверять тому, что написано, проверьте токен идентификатора.
Подробнее
Каков срок истечения срока действия токена ID в OpenID Connect?
Если какая-либо из процедур проверки, определенных в этом документе, не срабатывает, любые операции, требующие информации, которая не прошла проверку, ДОЛЖНЫ быть прерваны, а информация, не прошедшая проверку, НЕ ДОЛЖНА использоваться.
Чтобы подтвердить это, в документации Google OpenID Connect говорится о проверке токена идентификатора:
Одна вещь, которая делает токены ID полезными, заключается в том, что вы можете передавать их различным компонентам вашего приложения. Эти компоненты могут использовать токен идентификатора в качестве упрощенного механизма проверки подлинности для проверки подлинности приложения и пользователя. Но прежде чем вы сможете использовать информацию в токене идентификатора или полагаться на нее как на утверждение, что пользователь прошел аутентификацию, вы должны подтвердить ее.
Итак, если наше клиентское приложение собирается предпринять какие-то действия на основе содержимого токена ID, мы должны снова проверить токен ID.
Когда истекает срок действия токенов GCM и что такое InstanceID?
поскольку GCM продолжает обновляться, большинство ресурсов, которые я искал, кажутся устаревшими или неясными. В принципе, я запутался, когда истекает срок действия токенов и идентификаторов. (Для справки, я работаю с Android.)
из того, что я понимаю (и, пожалуйста, поправьте меня, если я ошибаюсь), мой сервер имеет ключ API и идентификатор отправителя. Используя идентификатор отправителя, я могу попросить моего клиента запросить токен через InstanceID, хранящийся локально на моем клиенте. Я уже немного запутался. В instanceid-это назначенный момент, когда мое приложение выходит в интернет? Она когда-нибудь меняется? Как насчет того, когда приложение обновляется или удаляется и переустанавливается (или устройство восстанавливается)? Позвонив в InstanceID.getInstance я всегда буду получать один и тот же InstanceID, или он в конечном итоге истечет и даст мне новый? Есть ли значение для хранения строки, которую вы получаете, вызывая getID ()? Документы, похоже, указывают, что вы фактически получаете новый InstanceID при вызове getID (), так что это еще больше усложняет ситуацию. (Для ссылка, я имею в виду: https://developers.google.com/instance-id/)
используя InstanceID, мой клиент может запросить токен с серверов GCM, который он затем отправляет на мой сервер приложений. Мой сервер приложений хранит этот маркер и может использовать его для отправки сообщений на серверы GCM, которые затем отправят сообщение на устройство. Я считаю, что устройство использует сохраненный InstanceID для фактического получения этих сообщений. Поэтому иметь класс, который расширяет GcmListenerService позволит мне получать эти сообщения с onMessageReceived? Мне не нужно делать ничего особенного (кроме определения его в AndroidManifest)? Мне не нужно на самом деле говорить ему использовать InstanceID? Он просто волшебным образом знает?
когда истекает срок действия этих идентификаторов и токенов? У них есть срок годности? Я храню токен как строку на сервере, но если в какой-то момент один из них истекает, как я могу знать, что они истекли? Я всегда могу создать новый InstanceID и токен, это кажется легким, но затем сделайте старые остаются активными? Как стереть старые токены с сервера? Кажется, есть простой способ сделать это с APNS на стороне iOS вещей, где вы можете получить список всех истекших токенов и просто стереть их из своей базы данных.
3 ответов
Я обнаружил, что задаю большинство этих вопросов сам, когда я обновляю свою реализацию GCM. После возиться с ним несколько дней, вот мой взгляд на ваши вопросы.
из того, что я понимаю (и, пожалуйста, поправьте меня, если я ошибаюсь), мой сервер имеет ключ API и идентификатор отправителя. Используя идентификатор отправителя, я могу попросить моего клиента запросить токен через InstanceID, хранящийся локально на моем клиенте.
InstanceID назначается момент, когда мое приложение выходит в интернет?
похоже, он назначен, как только приложение запускается, даже если устройство не может получить доступ к интернету.
это когда-нибудь изменится? Как насчет того, когда приложение обновляется или удаляется и переустанавливается (или устройство восстанавливается)? Позвонив в InstanceID.getInstance я всегда буду получать один и тот же InstanceID, или он в конечном итоге истечет и даст мне новый?
идентификатор экземпляра стабилен, но может стать недействительным, если:
если идентификатор экземпляра стал недопустимым, приложение может вызвать getId (), чтобы запросить новый идентификатор экземпляра.
я протестировал удаление приложения и очистку данные и результаты указывают на то, что все вышеперечисленное верно.
есть ли значение для хранения строки, которую вы извлекаете, вызывая getID ()?
похоже, что API обрабатывает это в локальном хранилище вашего приложения для вас.
используя InstanceID, мой клиент может запросить токен с серверов GCM, который он затем отправляет на мой сервер приложений. Мой сервер приложений хранит этот маркер и может использовать его для отправки сообщений на серверы GCM, который затем отправит сообщение на устройство. Я считаю, что устройство использует сохраненный InstanceID для фактического получения этих сообщений. Поэтому иметь класс, который расширяет GcmListenerService позволит мне получать эти сообщения с onMessageReceived? Мне не нужно делать ничего особенного (кроме определения его в AndroidManifest)? Мне не нужно на самом деле говорить ему использовать InstanceID? Он просто волшебным образом знает?
насколько я могу судить, не было никакого InstanceId в предыдущая реализация, и не похоже, что она явно используется в этом. Если это так, то он вызывается в любом GcmReceiver или GcmListenerService.
когда и жетоны эти документы действительны? У них есть срок годности?
Я уже обратился к истечению ID, и мы можем узнать о токенах, истекающих в руководство по реализации Android InstanceID:
служба ID экземпляра периодически инициирует обратные вызовы (например, каждые 6 месяцев), запрашивая обновление маркеров приложения. Он также может инициировать обратные вызовы, когда:
руководство говорит подкласс InstanceIDListenerService и переопределить onTokenRefresh() для обработки таких ситуаций.
Я храню токен как строку на сервере, но если в любой момент один из них истекает, как я могу знать, что они истекли?
на руководство по реализации GCM на вашем сервере говорит, что сервер GCM ответит на ваш сервер некоторой информацией о токене, который вы использовали для отправки push-уведомления.
Я всегда могу создать новый InstanceID и токен, это кажется легким, но тогда старые остаются активными?
мои тесты показывают, что да, они делают.
Как стереть старые маркеры с сервера? Кажется, есть простой способ сделать это с APNS на стороне iOS вещей, где вы можете получить список всех истекших токенов и просто стереть их из своей базы данных.
Я все еще изучаю это и буду обновите, если я смогу что-то выяснить.
@pumpkinpie65 и @B. Roth вот что я сделал, чтобы обнаружить недопустимые токены в моей базе данных.
в GCM есть опция «dry run» при отправке уведомления пользователю/списку пользователей. Когда вы устанавливаете dry-run во время отправки уведомлений, он не предупреждает клиентов или не показывает им уведомления, но возвращает ответ о том, какие токены действительны(200), а какие нет.
Если вы отправляете уведомление 200 пользователям с использованием опции dry-run, то в том же порядке вы будете получите ответ от GCM.
Что такое идентификатор экземпляра?
Instance ID предоставляет уникальный идентификатор для каждого экземпляра ваших приложений. Вы можете реализовать идентификатор экземпляра для приложений Android и iOS, а также приложений/расширений Chrome.
помимо предоставления уникальных идентификаторов для аутентификации, идентификатор экземпляра может генерировать токены безопасности для использования с другими службами.
Основные Возможности
жизненный цикл ID экземпляра
когда идентификатор экземпляра становится недействительным?
если идентификатор экземпляра стал недействительным, приложение может вызвать getId (), чтобы запросить новый идентификатор экземпляра. Доказать право собственности на экземпляр ID и разрешить серверам доступ к данным или службам, связанным с приложением, вызовите getToken (строка, строка).
когда обновить ключи?
служба идентификаторов экземпляров периодически инициирует обратные вызовы (например, каждые 6 месяцев), запрашивая обновление токенов приложения. Он также может инициировать обратные вызовы, когда:
существуют проблемы безопасности; например, проблемы SSL или платформы. Информация об устройстве больше не действительна; например, резервное копирование и восстановление. Этот В противном случае затрагивается служба ID экземпляра.
все, что вам нужно знать об идентификаторе экземпляра, можно найти по следующим официальным ссылкам:
Должен ли истекать срок действия токенов доступа OAuth2 для мобильного приложения?
предполагая, что мы не поддерживаем незашифрованную передачу токена доступа, заботится о первая точка пуля.
предполагая, что мы в порядке с выполнением поиска базы данных против отзываемого, полностью случайного маркера доступа заботится о втором.
для мобильных приложений аутентификация клиента не может быть сильнее, потому что » client_id и client_secret, полученные при регистрации, встроены в исходный код вашего приложения. В этом контексте client_secret явно не рассматривается как секрет.»( Google). Это исключает третья проблема.
Итак, в чем преимущество разделения кратковременных токенов доступа и долгоживущих токенов обновления в этом сценарии? Это «хорошо», чтобы просто выдавать маркеры доступа без истечения срока действия и игнорировать всю часть токена обновления?
3 ответов
Если злоумышленник получает доступ к вашей не истекающий токен доступа, он может напрямую позвонить на ваш сервер ресурсов и получить конфиденциальные данные в качестве ответа.
Теперь, если он украл ваш маркер, Он сначала должен вызвать сервер авторизации и получить маркер доступа в ответ. Тогда он может запросить сервер ресурсов для конфиденциальных данных.
каждый раз, когда маркер доступа запрашивается с вашего сервера авторизации с помощью маркера обновления, спецификация OAuth 2 (по крайней мере, последний проект на данный момент) требует от сервера проверить личность клиента, и если он привязан к маркеру, если это возможно.
поскольку обычный подход с секретом клиента не работает, чтобы определенно идентифицировать установленное приложение на открытой платформе, Платформа под управлением приложение должно предоставить методы для этого. Google, например, требует, чтобы приложения Android были подписаны разработчиком. При запросе учетных данных для приложения Android с помощью в Google API в консоли, поэтому вы должны указать отпечаток сертификата, который вы использовали для подписания заявления и получить только идентификатор клиента, но не секрет в ответ. При выдаче токенов Google может решить, было ли приложение авторизовано разработчиком для запросите жетоны на его имя.
Если вы определенно не можете проверить личность клиента, по крайней мере, в некоторых случаях можно распознать, что маркер обновления был украден. Спецификация имеет пример:
когда аутентификация клиента невозможна, сервер авторизации должен развернуть другие средства для обнаружения злоупотребления токеном обновления.
например, сервер авторизации может использовать вращение маркер обновления в который новый маркер обновления выдается с каждым ответом на обновление маркера доступа. Предыдущий маркер обновления недействителен, но сохраняется сервером авторизации. Если маркер обновления скомпрометирован и впоследствии используется как злоумышленником, так и законным клиентом, один из них представит недействительный маркер обновления, который сообщит серверу авторизации о нарушении.
самая большая проблема с не истекающим токеном доступа заключается в том, что нет механизма для замены украденного токена. Если я получаю доступ к вашему маркеру доступа без истечения срока действия, то я фактически вы для этой системы. Если токен недолговечен и истекает, то есть механизм замены украденного токена и ограничение на окно я должен взломать ваш токен.
предположим, мне требуется 3 часа, чтобы взломать пакет и получить токен, но токен доступа хорош только для двух несколько часов. Затем, к тому времени, когда я не могу взломать вашу учетную запись, токен изменился, и я должен начать все сначала. Если токен не истекает, у меня есть полный доступ к вашей учетной записи, и у вас нет возможности заменить его, кроме удаления токена и принудительной повторной авторизации.
токены доступа OAuth2 не должны истекать (или, скорее, они истекают, но это может быть через много лет).
маркер доступа может использоваться один раз для получения определенных ресурсов с сервера ресурсов, в частности, он позволяет получать ресурсы, одобренные пользователем. Маркер обновления, с другой стороны, позволяет повторный доступ. Таким образом, нельзя избавиться от токенов обновления, не требуя взаимодействия пользователя между каждым доступом.
в целом, хотя, токены иногда могут быть украдены другими вредоносными приложениями на том же устройстве или атаками MITM на телефоне. SSL способен MITM, если телефон можно заставить доверять сомнительному сертификату. Это иногда требуется компаниями для доступа к внутренним сетям (они требуют принятия самозаверяющего сертификата, который позволяет им MITM весь зашифрованный трафик, происходящий по сети компании. Таким образом, предполагая, что отправка зашифрованных токенов означает, что они не могут быть украдены в пути, опасно.
токены на предъявителя не слабее, чем любая другая форма токена как таковая, как доказано в куче документов (включая один из моих собственных, на который я отправлю ссылку, когда смогу его откопать.) Однако токены на предъявителя подходят только в тех случаях, когда допущения, которые они делают, действительны. Предположение о том, что токен может храниться в секрете, является основным предположением о токенах на предъявителя в целом. Если это не так, токены-носители не утверждают никаких свойств безопасности (хотя некоторые из них все еще сохраняются). См.NIST Уровень 3 токены, которые определяют, какие атаки токены-носители должны победить, как указано в Токены На Предъявителя OAuth. Короче говоря, токены на предъявителя не должны побеждать кражу токена.
токены на предъявителя не могут быть отозваны, это правда. Однако, учитывая, что обычным шаблоном доступа является использование маркера доступа сразу после приобретения, токены доступа должны истекать довольно быстро, чтобы предотвратить потенциальное злоупотребление, даже если случай злоупотребления не может быть придумано в настоящее время. Чем дольше находится токен, тем больше вероятность его кражи. Маркер обновления на самом деле гораздо опаснее украсть, поскольку он обеспечивает повторный доступ в течение более длительного периода времени, если вы не можете защитить идентификатор клиента. OAuth2 может предоставить доступ к ресурсам в целом и, например, может использоваться для предоставления API клиенту на время. С помощью токена обновления можно нанести значительно больший ущерб, в отличие от одного токена использования.
клиент аутентификацию можно сделать более безопасной несколькими способами, например, предоставляя каждому клиенту при загрузке другой ключ. Это предотвращает обобщенные атаки, когда обратное проектирование маркера на одном устройстве нарушает безопасность для всех экземпляров клиента. Другие потенциальные методы включают использование OAuth для проверки клиента с вашим сервером, который затем выполняет второй запуск протокола OAuth с сервером авторизации, к которому вы хотите получить доступ. Это позволяет вам иметь клиентов, которые обновляют их ключи регулярно, и для них у всех должны быть разные ключи, при этом не создавая чрезмерной нагрузки на системы, используемые сервером авторизации, принадлежащим Facebook или Google, например.
при использовании мобильного приложения долговечные токены обновления более безопасны, чем наличие какого-либо многофункционального токена на предъявителя, даже если не предпринимаются шаги для защиты клиента. Это происходит потому, что пользователь не может очистить маркер. Если токен обновления не украден, и пользователь просто хочет отозвать доступ тогда это можно сделать. Токен многоцелевого носителя не может быть отозван, даже если пользователь просто хочет отозвать доступ. Очевидно, что многофункциональный ссылочный маркер базы данных может быть отозван, но это не то, для чего предназначен протокол, и поэтому анализ безопасности, выполненный на OAuth, ничего не говорит о безопасности этой гибридной системы.
В заключение я бы рекомендовал использовать токены обновления и токены базы данных, так как это, скорее всего, будет безопасно. Если вы можете сделать все, чтобы защитить клиента, это бонус, но ситуации, которые это защищает, минимальны. Если вы хотите защитить клиента, рассмотрите мягкие токены, a la Google authenticator, поскольку это твердая реализация, которая выдержала анализ некоторыми очень умными людьми.
Почему срок действия токенов истекает?
Я только начинаю работать с Google API и OAuth2. Когда клиент авторизует мое приложение, мне выдают «токен обновления» и недолговечный «токен доступа». Теперь каждый раз, когда срок действия токена доступа истекает, я могу отправить свой токен обновления в Google, и они предоставят мне новый токен доступа.
У меня вопрос, какова цель истечения срока действия токена доступа? Почему вместо маркера обновления не может быть только длительного маркера доступа?
Кроме того, срок действия маркера обновления истекает?
См. Использование OAuth 2.0 для доступа к API Google для получения дополнительной информации о рабочем процессе Google OAuth2.
Это очень сильно зависит от реализации, но общая идея заключается в том, чтобы позволить провайдерам выдавать токены краткосрочного доступа с токенами долгосрочного обновления. Зачем?
Несколько сценариев могут помочь проиллюстрировать цель доступа и обновления токенов и технические компромиссы при разработке системы oauth2 (или любой другой аутентификации):
Сценарий веб-приложения
В сценарии веб-приложения у вас есть несколько вариантов:
В 1 access_token и refresh_token путешествуют только по проводам между сервером авторизации (в вашем случае Google) и сервером приложений. Это будет сделано по безопасному каналу. Хакер может захватить сеанс, но он сможет взаимодействовать только с вашим веб-приложением. Во 2 хакер может убрать access_token и сформировать свои собственные запросы к ресурсам, к которым пользователь предоставил доступ. Даже если хакер завладеет access_token, у него будет только короткое окно, в котором он сможет получить доступ к ресурсам.
В любом случае, refresh_token и clientid / secret известны только серверу, поэтому веб-браузер не может получить долгосрочный доступ.
Давайте представим, что вы реализуете oauth2 и установили длинный тайм-аут на токене доступа:
В 1) нет большой разницы между токеном короткого и длинного доступа, так как он скрыт на сервере приложений. Во-вторых, кто-то может получить access_token в браузере, а затем использовать его для прямого доступа к ресурсам пользователя в течение длительного времени.
Мобильный сценарий
На мобильном телефоне есть несколько известных мне сценариев:
Сохраните клиентские данные / секретные данные на устройстве и организуйте доступ к ресурсам пользователя.
Используйте бэкэнд-сервер приложений, чтобы держать клиент / секрет и заставить его выполнять оркестровку. Используйте access_token как своего рода сеансовый ключ и передайте его между клиентом и сервером приложений.
В 1) Когда у вас есть клиент / секрет на устройстве, они больше не являются секретом. Любой может декомпилировать, а затем начать действовать так, как будто это вы, с разрешения пользователя, конечно. Access_token и refresh_token также находятся в памяти и могут быть доступны на скомпрометированном устройстве, что означает, что кто-то может выступать в качестве вашего приложения, не предоставляя пользователю свои учетные данные. В этом сценарии длина access_token не влияет на возможность взлома, так как refresh_token находится в том же месте, что и access_token. В 2) клиент / секрет или токен обновления скомпрометированы. Здесь длина срока действия access_token определяет, как долго хакер сможет получить доступ к ресурсам пользователей, если они получат его.
Длина истечения
Здесь все зависит от того, что вы защищаете своей системой аутентификации, и от того, как долго должен истекать срок действия вашего access_token. Если это что-то особенно ценное для пользователя, оно должно быть коротким. Что-то менее ценное, это может быть дольше.
Надеюсь, что довольно длинный пост будет полезен.