Starlette 会话状态清除

问题描述

在处理一些 OAuth/0Auth 身份验证示例时尝试清除 Starlette 会话状态(使用 starlette.middleware.sessions.SessionMiddleware)时发现了一些奇怪的行为。

在 Flask 中,以下注销时的会话清除代码工作正常:

@app.route('/logout')
def logout():
    session.clear()
    params = {'returnTo': url_for('home',_external=True),'client_id': AUTH0_CLIENT_ID}
    return redirect(auth0.api_base_url + '/v2/logout?' + urlencode(params))

Starlette 中的等效 request.session.clear() 无法清除会话状态,即使在注销代码运行后,我仍然可以访问所有受登录保护的页面,因为会话状态以某种方式保留!我已经注释了下面的代码 - 问题和解决方法

async def logout(self,request):
    '''called when logout button is pressed - clear the session and redirect to root'''
    session = request.session      
    #session.clear()                # <- this doesn't achieve anything - session variables/cookies return on next request
    session.pop(PROFILE_KEY,None)  # <- popping just one of two works fine
    session.pop(JWT_PAYLOAD,None)  # <- popping the second (of two) leads to the same outcome as clear() (not good)
    session['logged_out'] = True    # <- but adding another dummy field/cookie fixes it
    #
    params = {'returnTo': 'https://my.awesome.page','client_id': AUTH0_CLIENT_ID}
    redir = self.auth0.api_base_url + '/v2/logout?' + urlencode(params,quote_via=quote_plus)
    #
    return RedirectResponse(url=redir)

所以简而言之,如果您完全清除会话,Starlette 似乎不喜欢它,而我的解决方法是在那里至少留下一些东西,即使只是一个不用于任何东西的虚拟值。

以前有人处理过这个问题吗?似乎是一个奇怪的问题。我错过了什么吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...