Dmy*_*yev 9 python authlib 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))
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
简而言之,Starlette 似乎不喜欢你完全清除会话,而我的解决方法是至少在其中留下一些东西,即使只是一个不用于任何用途的虚拟值。
以前有人必须处理过这个问题吗?似乎是一个奇怪的问题。我错过了什么吗?
| 归档时间: |
|
| 查看次数: |
1826 次 |
| 最近记录: |