--- title: Обновить сессию description: Выполните refresh по сроку или после 401 и повторите исходный запрос. sources: - eazy_sdk.auth.session_auth - eazy_sdk.auth.RefreshToken - eazy_sdk.auth.ExpiresAt api_fingerprint: "sha256:cd1125189a3510394c327d07d91106a26e9bba4cd0fe9234a4d4639adc92c2af" --- `RefreshToken()` отмечает значение для обновления, а `ExpiresAt()` позволяет сделать refresh до защищённого запроса. Если сервер всё же отвечает `401`, runtime обновляет сессию и один раз повторяет исходный вызов. :::::{grid} 1 1 2 2 :class-container: http-exchange :gutter: 2 ::::{grid-item} :class: http-panel http-panel--request **→ Запрос** · ``POST /auth/refresh`` ```json {"refresh_token": "refresh-1"} ``` :::: ::::{grid-item} :class: http-panel http-panel--response **← Ответ** · ``200 OK`` ```json { "access_token": "access-2", "refresh_token": "refresh-2", "expires_at": "2099-01-01T00:00:00Z" } ``` :::: ::::: :::::{tab-set} :sync-group: transport ::::{tab-item} HTTP :sync: http `LoginService.refresh(...)` извлекает секрет из текущей модели и вызывает публичную refresh-операцию через тот же корень SDK. ```{literalinclude} ../../../../../../examples/docs/auth_lifecycle.py :language: python :start-after: "# region docs: auth-lifecycle-service" :end-before: "# endregion docs: auth-lifecycle-service" ``` Пример начинает с сохранённого `access-1`. Сервер отклоняет его, после чего runtime вызывает refresh и повторяет `GET /account` с `access-2`. ```{literalinclude} ../../../../../../examples/docs/auth_refresh.py :language: python :start-after: "# region docs: auth-refresh-run" :end-before: "# endregion docs: auth-refresh-run" ``` :::: ::::{tab-item} Браузер :sync: browser Браузер хранит токен и срок в состоянии страницы; обновление одной сессии для нескольких вкладок показано в {doc}`главе о браузерной сессии `. ```{literalinclude} ../../../../../../examples/mail/site/app.py :language: html :start-after: "" :end-before: "" ``` :::: ::::: | Причина refresh | Когда он выполняется | Что происходит с вызовом | |---|---|---| | `ExpiresAt()` считает сессию просроченной | До отправки | Запрос уходит один раз с новой сессией | | Защищённый ответ дал `401` | После первого ответа | Запрос повторяется в пределах `auth_retries` | | Refresh завершился ошибкой | Во время обновления | Старая revision не заменяется | :::{dropdown} Запускаемый файл целиком ```{literalinclude} ../../../../../../examples/docs/auth_refresh.py :language: python ``` ::: ```text account: user-42 GET /account Bearer access-1 POST /auth/refresh GET /account Bearer access-2 ``` ## Дальше - {doc}`Повторно использовать сессию ` - {doc}`Войти и получить сессию ` - {doc}`Настроить повтор HTTP-запроса `