Обновлять токены, необходимые для онлайн-приложений
Per Документы Google, казалось бы, токены обновления необходимы только для автономных приложений (приложений, которые могут запускаться в токен с истекшим доступом, когда пользователь не вокруг).
токены доступа периодически истекают. Вы можете обновить токен доступа без запроса пользователю разрешения (в том числе, когда пользователь нет), если вы запросили автономный доступ к связанным областям с токеном.
...
Запрос на автономный доступ является требованием для любого приложения, которое необходимо получить доступ к API Google, если пользователь отсутствует. Для например, приложение, которое выполняет службы резервного копирования или выполняет действия в предопределенное время должно быть в состоянии обновить свой токен доступа, когда пользователя нет. Стиль доступа по умолчанию называется онлайн.
Однако описание токенов обновления в целом и этот вопрос в частности оба, похоже, подразумевают, что токены обновления необходимы в любое время, когда вы хотите запросить новый токен доступа.
Я думаю, что согласен с объяснением Google и не использую токены обновления. Мой опыт работы с поставщиками OIDC состоял в том, что обновление работает следующим образом:
- Пользователь запрашивает защищенный ресурс с клиентского сервера
- Клиентский сервер определяет, что токен доступа истек.
- Клиентский сервер перенаправляет пользователя на конечную точку аутентификации OP
- OP аутентифицирует пользователя без взаимодействия из-за файлов cookie, хранящихся в браузере пользователя с доменом OP.
- Клиентский сервер завершает запрос.
Пользователь может видеть несколько переадресаций, но кроме этого повторная аутентификация прошла без какого-либо взаимодействия с ними. Учитывая это, нужно ли беспокоиться об обновлении токенов, если пользователь всегда будет присутствовать в приложении?
Ответы
Ответ 1
Нет, нет необходимости беспокоиться об обновлении токенов, если пользователь всегда будет присутствовать в приложении. Обоснование в основном описывается ОП.
Но есть причины, по которым все еще может понадобиться токен обновления:
- поскольку OP упоминает, что пользователь может увидеть несколько переадресаций, и как эксперт по пользовательскому интерфейсу, так и брендирующий парень в вашей команде будут ненавидеть это.
- когда токен доступа истекает в середине действия POST HTML-формы, перенаправление, возможно, потеряло данные о контексте /POST при возврате; вы можете свести к минимуму это или вам придется принимать соответствующие (сложные) POST-данные-save-действия.
- если срок действия токена доступа действительно короткий, перенаправления создают много накладных расходов и неприятностей; вы не сможете контролировать истечение срока доступа к токену при работе с Провайдерами в другом домене и при работе с несколькими провайдерами он будет меняться по ним.
- при обновлении токена доступа с перенаправлением вашего приложения теперь зависит от поставщика, поддерживающего сеанс единого входа; не все Провайдеры могут это сделать, и если они это сделают, они могут сделать это по-разному: продолжительность сеанса единого входа может варьироваться между ними, и метод аутентификации может отличаться; в качестве примера: поставщик, который не поддерживает сеанс единого входа, но использует двухфакторную аутентификацию, будет иметь большое влияние на пользовательский интерфейс.
Представьте себе сценарий, в котором вы хотите использовать токен доступа для обновления информации о пользователе почти в реальном времени с конечной точки информации пользователя, но истечение срока доступа к токенам относительно невелико. Либо вам придется выполнять много переадресаций с неприятностью, как описано, или вы можете использовать токен обновления.
Ответ 2
Моя самая большая проблема с использованием токенов обновления для онлайн-приложений заключается в том, что он отнимает от пользователя прозрачность.
Обновленные токены облегчают долгосрочный доступ и должны храниться безопасно. Но они также не обеспечивают естественный способ "выйти", и (что наиболее важно) становится совершенно непрозрачным, как, когда и откуда доступны ваши данные, как предлагает часто используемое имя области offline_access
.
OIDC предлагает механизм переднего канала prompt=none
, который в значительной степени приводит к такому же эффекту (т.е. новым токенам) и без необходимости промежуточных переадресаций, если повторная аутентификация выполняется внутри iframe.
Следовательно, по-моему, вы и Google правы, и ответ должен быть: Нет, не используйте токены обновления, если пользователь присутствует.
Ответ 3
Обновить токен - это важная ссылка на учетные данные, которую ваш клиент может обменять на токен доступа, когда нет активного сеанса пользователя.
Например, если вы хотите периодически синхронизировать проблемы с Github с вашей внутренней системой.
Он часто используется неправильно, как какой-то сеанс. Очень важно разобраться в этом. И имя области offline_access существует по какой-то причине.
Итак, в простых случаях - вы просто полагаетесь на сеанс OP и получаете новый токен с компиляцией endize endize/token. Вам не следует запрашивать учетные данные, пока сеанс жив, и для данного приложения дается согласие.
Если вам нужно сделать некоторые вещи назад - попросите также обновить токен.
Что касается вопроса: нет.
EDIT (Более подробное объяснение):
если мы говорим о сети, есть два основных случая:
Клиент, который может безопасно хранить секреты, такие как обычное веб-приложение, с отображением страницы сервера и клиентами, которые не могут хранить секреты, например, приложения SPA. С этой точки зрения существуют два основных потока (исключая гибрид, чтобы не чрезмерно усложнять): поток кода авторизации и неявный поток соответственно.
Поток кода авторизации
При первом запросе ваше приложение проверяет собственный сеанс (сеанс клиента), а если нет, перенаправление на внешний OP (поставщик OpenID Connect) разрешает URL-адрес. OP аутентифицирует пользователя в соответствии с требованиями, выраженными в запросе, собирает согласие и другие данные и возвращает код авторизации. Затем клиент запрашивает у него конечную точку токена и получает пару access_token/id_token с необязательным токеном обновления, если пользователю разрешено разрешение на автономное подключение. Это важно, потому что пользователь может отрицать это для вашего приложения. После этого клиент может запросить конечную точку userInfo для получения всех заявлений пользователей, которые были предоставлены во время согласия. Эти претензии представляют собой идентификацию пользователя и не содержат таких вещей, как метод аутентификации, acr и т.д. Эти претензии присутствуют в id_token наряду с истечением, например. После этого клиент запускает свой собственный сеанс и имеет возможность установить его время жизни равным id_token lifetime или использовать его для обеспечения гладкого UX, например. На этом этапе вы можете вообще отказаться от access_token и id_token, если вам не нужен доступ к другим API (например, все области доступа в access_token специфичны для OP и subject). Если вам нужен доступ к некоторому API, вы можете сохранить access_token и использовать его для доступа. Он становится недействительным - перенаправление на OP для нового. Истечение срока действия может быть более слабым из-за более безопасной среды на сервере. Так что даже 1 час - это вариант. Никаких токенов обновления не используется вообще.
Неявный поток
В этом случае вы можете сказать, что Angular перенаправляет приложение на OP, получает его id_token и необязательный access_token с авторизации конечной точки напрямую и использует его для доступа к некоторым API. По истечении каждого запроса проверяется, если необходимо, клиент отправляет запрос в OP в скрытом iFrame, поэтому никаких видимых переадресаций не будет, пока OP-сеанс жив. Для этого есть несколько отличных библиотек, таких как openid-client.js. Никакое обновление не разрешено здесь вообще.
Важно различать сеанс клиента из сеанса OP, времени жизни токена и времени сеанса.
Для решения некоторых конкретных задач существует гибридный поток. Его можно использовать для получения кода авторизации и id_token для вашего сеанса в одном запросе. Нет чата в сети.
Итак, когда вы думаете об обновлении токена, просто проверьте свои потребности и сопоставьте их со спецификацией:) И если вам это нужно, сохраните его как можно безопаснее.
Ответ 4
Обновить токены полезны для приложений, которые хранят токены доступа в сеансе сервера. Например, если веб-приложение не вызывает защищенный сервис с использованием JavaScript XHR, но называет его бэкэнд, а бэкенд вызывает службу. В этом случае легче получить новый токен доступа, когда это необходимо, чтобы попросить пользователя создать новый.
В приложениях JavaScript, работающих в браузерах, токены обновления не могут использоваться, потому что для получения маркера доступа из конечной точки /token
требуется секретный ключ клиента, и вы не можете хранить секрет в таких приложениях.
Процесс получения новых токенов доступа, которые вы описали, может быть улучшен - приложение может запросить новый токен доступа перед истечением текущего, поэтому пользователь не перенаправляется на сервер OAuth2, но приложение вызывает /auth
с параметром prompt=none
в iframe.