首页 > 解决方案 > 从 OpenID 连接提供者回调重定向后无法访问 Flask-Login current_user

问题描述

我正在使用 openID 提供程序来验证我的烧瓶应用程序的用户。在认证网站上认证后,提供者向我的回调端点发送一个携带用户信息的 id_token 作为POST请求。

我解码此令牌,创建用户对象并将其保存在缓存中。保存用户后,用户登录后使用flask_login.login_user()功能重定向到首页

@app.route("/opentoken", methods=['POST'])
def openid_callback():
    token = request.form['id_token']
    decoded_token = jwt.decode(token, verify=False)
    preferred_username = decoded_token['preferred_username']
    user = save_user(preferred_username, decoded_token)
    login_user(user)
    log.info(current_user) #That confirms the current_user has the user info
    return redirect('/home')

预期的行为是,在重定向时,主端点将可以访问flask_login.current_user. 这应该发生,因为烧瓶登录集成应该让烧瓶在每个请求之前调用这个函数。

@app.login_manager.user_loader
def load_user(_id):
  try:
    user = users[_id]
    return user
  except KeyError:
    return None

但是,实际行为是不同的。被叫端点重定向后/home无法访问current_user

@home_bp.route('/home')
def home():
    print(f"Current User: {current_user}") #This returns that the user is AnonymousMixin
    return render_template(....)

然而,如果页面被刷新(直接调用端点),它能够选择current_user并打印登录用户的信息。

换句话说,在重定向时,login_manager.user_loaderflask-login 回调不会被调用,而是在直接调用端点时照常调用。

我不确定我是否遗漏或误解了某些内容,或者是否存在导致此行为的特殊错误。

标签: flaskflask-login

解决方案


推荐阅读