Как выйти из моего веб-приложения, используя okta? - PullRequest
0 голосов
/ 16 апреля 2019

Привет всем, я использую 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 Ответ

0 голосов
/ 17 апреля 2019

Проблема в том, что браузер все еще кэширует данные вашего сеанса.

Вы можете установить Заголовки управления кэшем для условного отсутствия кэширования для пользователей, вышедших из системы, согласно приведенному ниже коду, чтобы заставить браузер получать новую копию страницы, даже когда они нажимают «назад».

Вы можете достичь этого с помощью html-страниц или непосредственно на вашей колбе с питоном

со страницы 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'))
...