Каков срок истечения срока действия ID-токена в OpenID Connect?

В OpenID Connect срок действия токена доступа истекает. Для потока кода авторизации это обычно короткое время (например, 20 минут), после чего вы используете токен обновления для запроса нового токена доступа.

У токена ID также есть срок действия. Мой вопрос в том, какова цель этого?

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

Итак, вы должны:

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

В спецификации OpenID Connect просто говорится, что при проверке токена идентификатора

"The current time MUST be before the time represented by the exp Claim."

который (возможно) поддерживает третий вариант выше.


ИЗМЕНИТЬ

Поскольку OpenID Connect основывается на OAuth2, ответ на дополнительный вопрос ниже можно найти в спецификации OAuth2 который говорит,

expires_in
     RECOMMENDED.  The lifetime in seconds of the access token.

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

{
 "access_token": "SlAV32hkKG",
 "token_type": "Bearer",
 "refresh_token": "8xLOxBtZp8",
 "expires_in": 3600,
 "id_token": "eyJhbG[...]"
}

Но к чему в этом случае относится expires_in? Токен доступа, токен обновления или токен идентификатора?

(Для информации IdentityServer3 устанавливает время истечения срока действия токена доступа).


person Appetere    schedule 05.09.2014    source источник


Ответы (8)


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

Идентификационный токен предназначен для доказательства клиенту, что пользователь прошел аутентификацию, и кто он в результате.

Когда Клиент получает токен идентификатора, он обычно делает что-то вроде преобразования его в ClaimsIdentity и сохраняет это, например, с помощью файла cookie.

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

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

  • Токены ID предназначены только для аутентификации Клиента (как описано выше).
  • Жетоны доступа не имеют ничего общего с Клиентами. Они предназначены для доступа к ресурсам, и Клиент обрабатывает их только в том случае, если ему, в свою очередь, необходимо вызвать ресурс.
  • Для чего-то вроде автономного приложения MVC или WebForms только требуется токен идентификатора. Если он не вызывает внешний ресурс, не к чему предоставлять доступ, поэтому токен доступа отсутствует.
person Appetere    schedule 12.09.2014
comment
У вас есть ссылки на это? Эухенио утверждает, что вы можете обновить токен идентификатора в его ответе. Это правда? - person AndyD; 11.07.2015
comment
Вы не можете обновить токен идентификатора в смысле продления срока его действия (так же, как токен доступа может быть обновлен с помощью токена автономного доступа). Но если у вас есть еще не истекший сеанс аутентификации с помощью поставщика OpenID Connect (например, файл cookie после входа в IdentityServer3), тогда, когда вы повторяете запрос на вход в систему, поставщик может пропустить аутентификацию (потому что файлы cookie говорят, что вы это сделали) и просто верните новый ID-токен (и токен доступа, если требуется). Это работает только в том случае, если cookie имеет более длительный срок службы, чем токен идентификатора. - person Appetere; 13.07.2015
comment
Хотя вы можете это сделать, я не уверен, правильно ли это делать. Это также будет непросто для конечного пользователя, поскольку для этого потребуется несколько перенаправлений браузера. - person Kir; 18.08.2017
comment
@Kir Если вы используете одностраничное приложение Javascript (SPA), то первая попытка обновления токена доступа обычно будет фоновым процессом, поэтому конечный пользователь не будет прерван. Например, если API вашего ресурса отвечает, что срок действия токена доступа истек, то SPA делает фоновый запрос к серверу идентификации для нового токена доступа. Только в случае неудачи (из-за истечения срока действия токена ID) вы должны попросить пользователя снова войти в систему. См. Образец JavascriptImplicitClient по адресу github.com/IdentityServer/IdentityServer3.Samples/tree / master / например код. - person Appetere; 20.08.2017
comment
Вы можете обновить Id_token, если провайдер OIdC поддерживает возврат его из запроса Refresh_token. См. stackoverflow.com/questions/41168304/ и stackoverflow.com/questions/41741982/ - person Michael Freidgeim; 14.10.2017
comment
Как указано в другом ответе: «Идентификационному токену нельзя доверять, и его содержимое следует игнорировать, если текущее время больше, чем истекшее время». - person Michael Freidgeim; 15.10.2017
comment
@Appetere, что произойдет, если вы захотите выполнять вызовы REST на свой собственный сервер. Если вы выбросите токен идентификатора, что вы можете использовать для аутентификации клиента? Вы предполагаете, что у него есть доступ до истечения срока действия вашего собственного сеанса? - person Nth.gol; 25.07.2018
comment
@ Nth.gol Вы используете связанный токен доступа для предоставления доступа к ресурсам API. Токен доступа запрашивается одновременно с токеном идентификации, и его область действия ограничена ресурсами, к которым он предназначен для предоставления доступа. - person Appetere; 25.07.2018
comment
Маркер доступа предназначен для доступа к защищенным ресурсам IdP, а не к вашему собственному серверу. Возможно, меня смущает то, что «клиент» в вашем ответе - это ваш собственный сервер, а не клиент браузера. - person Nth.gol; 25.07.2018
comment
@ Nth.gol Когда вы запрашиваете токен доступа у IdP, вы указываете параметр области. Это может включать такие области, как профиль и электронная почта, которые IdP может поддерживать в конечной точке User Info, так что да, он может защитить ресурсы IdP, как вы говорите. Но вы также можете указать области для ваших ресурсов (например, API), api1, api2, чтобы тот же токен доступа также использовался для защиты этих ресурсов. - person Appetere; 26.07.2018

Мне пришлось копаться в этом по своим причинам и я написал это, поэтому я опубликую здесь то, что узнал ...

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

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

Следовательно, точно так же, как токен доступа (используемый для авторизации - указывающий какие разрешения есть у пользователя) может быть обновлен, можете ли вы обновить токен идентификатора (используемый для аутентификации - указав < em> кто пользователь)? Согласно спецификации OIDC, ответ неочевиден. В OIDC / OAuth есть три «потока» для получения токенов: поток кода авторизации, неявный поток и гибридный поток (которые я пропущу ниже, потому что это вариант двух других).

Для неявного потока в OIDC / OAuth вы запрашиваете токен идентификатора в конечной точке авторизации, перенаправив пользователя в браузере на конечную точку авторизации и включив id_token в качестве значения параметра запроса response_type. ТРЕБУЕТСЯ неявный ответ успешной аутентификации потока для включения id_token.

Для потока кода аутентификации клиент указывает code в качестве значения параметра запроса response_type при перенаправлении пользователя на конечную точку авторизации. Успешный ответ включает код авторизации. Клиентский клиент делает запрос к конечной точке токена с кодом авторизации и, согласно Основной раздел OIDC 3.1.3.3 Успешный ответ токена ответ ДОЛЖЕН содержать токен идентификатора.

Таким образом, для любого потока вы изначально получаете идентификатор ID, но как его обновить? Раздел 12 OIDC: Использование токенов обновления содержит следующее заявление о Обновить ответ токена:

После успешной проверки токена обновления телом ответа является ответ токена из раздела 3.1.3.3, за исключением того, что он может не содержать id_token.

Он может не содержать ID-токен, и, поскольку не указан способ принудительного включения ID-токена, вы должны предполагать, что ответ не будет содержать ID-токен. Таким образом, технически не существует определенного способа «обновить» токен ID с помощью токена обновления. Следовательно, единственный способ получить новый идентификатор ID - это повторно авторизовать / аутентифицировать пользователя, перенаправив пользователя на конечную точку авторизации и запустив неявный поток или поток кода аутентификации, как описано выше. Спецификация OIDC добавляет параметр запроса prompt в запрос авторизации поэтому клиент может запросить, чтобы сервер авторизации не запрашивал у пользователя какой-либо пользовательский интерфейс, но перенаправление все равно должно происходить.

person Scott Willeke    schedule 30.10.2015
comment
Если вы пишете общее программное обеспечение для работы с произвольным поставщиком авторизации, вы не можете рассчитывать на возврат id_token из обновления. Однако, если вы работаете с конкретным поставщиком (например, IdentityServer4), вы можете проверить его возможности и использовать id_token, полученный после запроса на обновление. - person Michael Freidgeim; 15.10.2017
comment
Итак, как можно обновить id_token? - person jwilleke; 18.11.2017
comment
@jwilleke AFAIK, как сказано выше, единственный способ получить новый токен идентификатора - это повторно авторизовать / аутентифицировать пользователя, перенаправив пользователя на конечную точку авторизации. - person Scott Willeke; 18.11.2017
comment
@MichaelFreidgeim Интересно, вы имеете в виду через механизм обнаружения Open ID Connect ? Как именно мы это делаем? - person Scott Willeke; 18.11.2017
comment
@ScottWilleke, я не уверен, обнаруживается ли это открытием. Я работал с определенным поставщиком identityServer4, и из документации я знаю, что id_token возвращается после обновления. Вы можете в своем коде проверить, возвращается ли он, а если нет, реализовать какой-то запасной вариант. - person Michael Freidgeim; 18.11.2017
comment
Хороший ответ в теле ответа обновления может не содержать id_token. Проголосовали. Между прочим, насколько я понимаю, спецификации OIDC действительно оставляют свободу действий для использования Refresh Token для получения нового ID-токена: клиент может сделать это, указав id_token в качестве одной из областей; но здесь по-прежнему применяется общая осторожность, потому что именно сервер аутентификации принимает окончательное решение о том, соблюдать ли запрошенную вами область. - person RayLuo; 10.11.2020

Если я правильно понимаю, согласно this и OpenID Connect Core 1.0 spec, сам токен идентификатора может храниться в файлах cookie в качестве механизма для сохранения сеансов и отправляться с каждым запрос к Клиенту, требующий аутентификации. Затем Клиент может проверить токен идентификатора либо локально, либо через конечную точку верификатора поставщика (если предоставлено, как Google). Если срок действия токена истек, он должен сделать еще один запрос аутентификации, за исключением этого раза с prompt=none в параметре URL. Также не забудьте отправить истекший токен ID в параметре id_token_hint, иначе поставщик может вернуть ошибку.

Таким образом, срок действия токена ID кажется естественным, но prompt=none гарантирует, что новый токен ID может быть получен плавно без вмешательства пользователя (если, конечно, пользователь не вышел из этого OpenID).

person Morrowless    schedule 23.08.2016

То же намерение: вы не можете использовать id_token после истечения срока его действия. Основное отличие состоит в том, что id_token - это структура данных, и вам не нужно вызывать какие-либо серверы или конечные точки, поскольку информация закодирована в самом токене. Обычный access_token обычно является непрозрачным артефактом (например, GUID).

Потребитель id_token должен всегда проверять его (временную) действительность.

Я не на 100% знаком с IS, но думаю, что это поле для удобства. Всегда проверяйте претензию exp.

Истечение срока - лишь одно из подтверждений. id_token также имеют цифровую подпись, и это также проверка, которую вы должны выполнить.

person Eugenio Pace    schedule 06.09.2014
comment
Спасибо, Эухенио. Главный вопрос, который у меня есть, - что делать, когда срок действия токена ID истекает? Я подумал (возможно, ошибочно), что для обновления недолговечного токена доступа вы должны были использовать токен обновления. Но если срок действия ID-токена такой же, как и у токена доступа, у вас сразу же будет просроченный ID-токен, поэтому обновление токена доступа будет казаться бессмысленным. Думаю, мне здесь что-то не хватает! - person Appetere; 07.09.2014
comment
Вы должны использовать (не отозванный) refresh_token, чтобы получить новый access_token или id_token. Или просто как пользователь для повторного входа в систему. id_tokens логически эквивалентны access_tokens. Просто другой формат. - person Eugenio Pace; 09.09.2014
comment
Мое последнее понимание заключается в том, что когда у пользователя есть аутентифицированный сеанс с сервером авторизации, когда срок действия токена доступа истекает, перенаправление 401 = ›302 на сервер авторизации получит новые токены доступа и идентификатора без вмешательства пользователя. Но в автономном режиме refresh_token будет возвращать только новый access_token, который говорит, что конкретному пользователю разрешен доступ к некоторому ресурсу. Он не может вернуть id_token, так как это будет означать, что конкретный пользователь аутентифицирован, а в автономном режиме это не так. - person Appetere; 10.09.2014
comment
Это был бы отличный ответ на вопрос о том, в чем разница между id_token и access_token (особенно при использовании непрозрачных / ссылочных токенов). Сосредоточьтесь на ответе на вопрос, а затем поясните, как используются токены доступа и идентификаторы? - person Trent; 28.06.2016

Обновление токена означает, что вы можете снова использовать его для запроса чего-либо с сервера авторизации (в данном случае OP - провайдера OpenID-Connect), ДАЖЕ КОГДА ПОЛЬЗОВАТЕЛЬ НЕ ВХОДИТ В СИСТЕМУ. Обычно вы разрешаете это только для ограниченных ресурсов и только после того, как пользователь вошел в систему и прошел аутентификацию хотя бы один раз. Сами токены обновления также должны быть ограничены по времени.

В неявном потоке OIDC вы вызываете конечную точку авторизации,
и получаете токен идентификатора в ответе вместе со всеми областями и в них всей информацией о утверждениях.
Последующие вызовы API должны выполняться с помощью потока кода.
Неявный поток предназначен для включения приложения только для javascript или только для браузера. Это не приложение, которое взаимодействует с сервером.
Таким образом, даже если существует способ «обновить» этот токен, вы не должны - с точки зрения безопасности - позволять ему жить слишком долго. Он будет украден и повторно использован неавторизованными пользователями, выдающими себя за идентификатор. Для этого вы должны принудительно ввести новый логин.

В потоке кода вы вызываете конечную точку авторизации OP и получаете код авторизации (также называемый токеном авторизации, или authcode для краткости). Он должен истечь аналогично id_token, который вы получили в неявном потоке, по тем же причинам и не может и не должен обновляться.

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

  • Идентификационный токен для аутентификации - который никогда не должен использоваться снова при вызовах сервера, кроме как в качестве подсказки во время выхода из системы, когда его срок действия больше не важен, и поэтому по причинам, указанным выше, он должен истекать и никогда не обновляться.
  • Access_token, который позже, при вызове API, может быть передан конечной точке UserInfo OP. Это вернет претензии, и API сможет выполнить соответствующую авторизацию.

Вы можете обновить этот access_token, поскольку он только сообщает API, какие утверждения есть у пользователя и какие ресурсы (по областям действия и утверждениям каждой области) пользователь согласился предоставить вам. Как объяснялось выше, это необходимо для разрешения доступа даже после того, как пользователь больше не вошел в систему. Конечно, вы никогда не хотите разрешать обновление id_token, потому что вы не хотите разрешать олицетворение без входа в систему.

person pashute    schedule 21.11.2015
comment
То, что вы сказали о неявном потоке, частично неверно. Клиент, использующий неявный поток, может получить маркер доступа в дополнение к маркеру идентификатора и может использовать этот маркер доступа для взаимодействия с сервером. - person Shaun Luttin; 16.11.2016
comment
Существует обычная практика, когда срок действия id_token истекает, клиент запрашивает новые токены с сервера, так что пользователю не нужно повторно авторизоваться. Например. см. damienbod.com/2017/06/02/ - person Michael Freidgeim; 12.10.2017

Я хотел опубликовать этот ответ в качестве комментария, но, поскольку я не был очень активен в StackOverflow, думаю, я публикую его как альтернативный ответ.

Вы также используете id_token в качестве id_token_hint при попытке выхода пользователя из сеанса http://openid.net/specs/openid-connect-session-1_0.html. Честно говоря, я не думаю, что действительно имеет значение, истек ли id_token на этом этапе, поскольку вас беспокоит только выход из системы определенного пользователя.

person dgonee    schedule 18.05.2015

TL; DR;

Перед тем, как доверять тому, что он говорит, проверьте токен идентификатора.

Подробнее

Каков срок истечения срока действия токена ID в OpenID Connect?

Цель состоит в том, чтобы позволить клиенту проверить токен ID, и клиент должен проверить токен ID перед операциями, в которых используется информация токена ID.

Из спецификации неявного потока OpenID:

Если какая-либо из процедур проверки, определенных в этом документе, не срабатывает, любые операции, требующие информации, которая не прошла проверку, ДОЛЖНЫ быть прерваны, а информация, не прошедшая проверку, НЕ ДОЛЖНА использоваться.

Чтобы подтвердить это, в документации Google OpenID Connect говорится о проверке токена идентификатора:

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

Итак, если наше клиентское приложение собирается предпринять какое-то действие на основе содержимого токена ID, мы должны снова проверить токен ID.

person Shaun Luttin    schedule 16.11.2016

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

Я пишу приложение Angular / Node, поэтому UI = Angular, API (сервер API) = Node / Express. Вместо того, чтобы создавать свою собственную аутентификацию по имени пользователя и паролю, я перехожу к сторонней аутентификации, позволяя им проверять подлинность того, что пользователи заявляют о себе. Вот два важных для меня путеводителя:

  1. Angular Authentication с помощью веб-токенов JSON (JWT): полное руководство
  2. Аутентификация Эйдзи на внутреннем сервере

Комбинируя №1 и angularx-social-login, я соединяю пользовательский интерфейс с Google, а затем присоединяю idToken к API, vola! Следуя № 2, используя API локальной библиотеки, можно проверить idToken, отлично!

Подождите, у idToken exp истекает через 1 час. Как мне его обновить?

Я понимаю, что все, что мне нужно, это аутентификация Google, мне все равно, какой стандарт и версию они используют, но, как и другие, я просто доверяю их аутентификации. Аутентификация - это в основном проверка того, кем они себя называют. Авторизация - это контроль доступа к тому, что и где пользователи могут делать / goto. Внутренний контроль доступа (позволяющий пользователям делать то, что) не предоставляется Google, они понятия не имеют об этом. Так что accessToken не должно быть в кадре. Верно?

Я провел несколько дней, изучая как обновить idToken, теперь пришел к выводу, что Google не рекомендует это и angularx-social-login предлагает способ. В № 2 Эйдзи четко заявил:   введите описание изображения здесь

Следовательно, решение для моей ситуации

  • использовать аутентификацию Google.
  • создает собственные правила управления сеансом / тайм-аут в API после начальной проверки idToken для смягчения exp.
  • желательно добавить данные сеанса в cookie с res.cookie("SESSIONID", myOwnID, {httpOnly:true, secure:true});

Для лучшей защиты Эйдзи также рекомендует Перекрестная защита аккаунтов. Надеюсь, это кому-то поможет!

person Jeb50    schedule 18.06.2021