gpt4 book ai didi

python - 在flask-login中使用request_loader的正确方法是什么

转载 作者:太空宇宙 更新时间:2023-11-03 15:02:28 31 4
gpt4 key购买 nike

我想要以下身份验证方案

  • 登录页面,用户使用电子邮件和密码登录,然后 Flask 服务器返回 JWT token
  • 为了以后访问 API,用户必须在授权 header 中提供 JWT token

但是,我并不完全理解flask-login的内部工作原理。我的初步理解是

  • 用户提交密码后,我们调用 login_user,flask-login 创建一个 session 来存储用户信息(也许是 user_id?)
  • 如果使用 login_required 装饰器,下次请求到来时,会在处理请求之前完成身份验证

我认为如果使用 JWT 身份验证,则只需要 request_loader 因为我们需要做的就是检查每个请求 header 。但如果只提供了 request_loader 函数(参见下面的代码),则会抛出异常。

Exception: No user_loader has been installed for this LoginManager. Add one with the 'LoginManager.user_loader' decorator.

更具体地说,我的问题是

  1. 如果我们要使用 JWT 身份验证,user_loaderrequest_loader 扮演什么角色?
  2. 如果同时提供了user_loaderrequest_loader,那么什么时候调用它们?
  3. 如果提供了 request_loader,为什么我们还需要 user_loader

这是我对这两个加载器的实现

@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))

@login_manager.request_loader
def load_user_from_request(request):

auth_str = request.headers.get('Authorization')
token = auth_str.split(' ')[1] if auth_str else ''
if token:
user_id = User.decode_token(token)
user = User.query.get(int(user_id))
if user:
return user
return None

最佳答案

我注意到异常(exception)

Exception: No user_loader has been installed for this LoginManager. Add one with the 'LoginManager.user_loader' decorator.

是由如下给出的logout处理程序引起的

@auth.route('/logout')
@login_required
def logout():
logout_user()
flash('You have logged out.')
return redirect(url_for('home.index'))

原因是flask-login需要找出要注销的用户,这是通过调用utils._get_user()函数来完成的,该函数调用login_manager._load_user() ,它进一步调用 login_manager.reload_user(),并且 reload_user() 将尝试调用函数 login_manager.user_loader 装饰将 session 中存储的 user_id 转换为用户实例。

因此,作为一种解决方法,可以定义此函数 login_manager.user_loader 装饰。我仍然认为这是一个错误,因为仅请求就已经能够确定用户实例,这不是 request_loader 的目的吗?

关于python - 在flask-login中使用request_loader的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44950028/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com