Как выйти из моего веб-приложения с помощью okta?

#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 /…