#python #session #flask #session-cookies #okta
#python #сессия #flask #сеансовые файлы cookie #okta
Вопрос:
Привет всем, я использую okta для создания входа в систему, область моих библиотек OpenIdConnect и UsersClient, я следую этому руководству https://developer.okta.com/blog/2018/07/12/flask-tutorial-simple-user-registration-and-login . Вход в систему работает, и я даже могу показать имя текущих пользователей в представлении, но когда я перехожу к маршруту выхода из системы, веб-приложение перенаправляется, но я все еще вошел в систему, и я вижу имя от моих пользователей, вы знаете, как выйти из системы и полностью очистить сеанс?
from flask import Flask,redirect, url_for,g
from flask_bootstrap import Bootstrap
from flask_migrate import Migrate,MigrateCommand
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_oidc import OpenIDConnect
# local imports
from config import app_config
from okta import UsersClient
import requests
db = SQLAlchemy()
app = Flask(__name__, instance_relative_config=True)
app.config.from_object(app_config["development"])
#Obtiene la clave secreta y la cadena de conexion del archivo config.py que se encuenstra en la carpeta instance
app.config.from_pyfile('config.py')
app.config["SECRET_KEY"] = "example"
app.config["OIDC_CLIENT_SECRETS"] = "client_secrets.json"
app.config["OIDC_COOKIE_SECURE"] = False
app.config["OIDC_CALLBACK_ROUTE"] = "/oidc/callback"
app.config["OIDC_SCOPES"] = ["openid", "email", "profile"]
app.config["OIDC_ID_TOKEN_COOKIE_NAME"] = "oidc_token"
oidc = OpenIDConnect(app)
okta_client = UsersClient("example", "example")
#Agrega bootstrap a la aplicacion, en este proyecto solo se utiliza wtf de esta libreria, lo demas son archivos
Bootstrap(app)
db.init_app(app)
"""
Comandos disponibles para migraciones: python manage.py db init, python manage.py db migrate
, python manage.py db migrate
"""
migrate = Migrate(app, db)
from Project import models
@app.before_request
def before_request():
if oidc.user_loggedin:
g.user = okta_client.get_user(oidc.user_getfield("sub"))
else:
g.user = None
@app.route("/login")
@oidc.require_login
def login():
return redirect(url_for("pagina.home"))
@app.route("/logout")
def logout():
эта функция выхода из системы не уничтожает мой сеанс
oidc.logout()
return redirect(url_for('pagina.home'))
Ответ №1:
Проблема в том, что браузер по-прежнему кэширует данные вашего сеанса.
вы можете установить для заголовков Cache-control значение no-cache условно для пользователей, вышедших из системы, согласно приведенному ниже коду, чтобы заставить браузер получать новую копию страницы, даже когда они нажимают «назад».
вы можете добиться этого с помощью HTML-страниц или непосредственно на вашем python flask
Со страницы Html
Для веб-страниц (HTML) добавьте следующие теги на страницы, которые вы хотите, чтобы браузеры не кэшировали (код должен быть в разделе вашей страницы, например, сразу после тега):
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
с конца колбы
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "0"
итак, ваш код должен выглядеть так
def logout(response):
response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
response.headers['Pragma'] = 'no-cache'
response.headers['Expires'] = '0'
return redirect(url_for('pagina.home'))
Комментарии:
1. Спасибо за ваш ответ, но ваш код не работает, через несколько часов я нашел ответ здесь devforum.okta.com/t /…