如何使用Flask通过所有路径登录用户?

时间:2018-08-14 13:03:48

标签: python flask flask-login

我陷入了一个循环,我有一个Web应用程序,登录和注册使用后端上的Flask和Jinja进行模板制作,这两个途径都没有使用JS,我使用WTForms进行表单验证和Flask登录以处理登录。

现在,当用户登录时,他被重定向到仪表板,该仪表板是一个使用React的单页应用程序,我将HTTP请求发送到我的使用Flask构建的API(相同的应用程序,但蓝图不同)。

问题是这些API路由仅适用于经过身份验证的用户,因此我使用了令牌系统来验证从客户端到服务器的API调用。

为此,我为我的登录管理器创建了一个请求加载器,该请求加载器在查询中使用令牌参数将对其进行解码,获取电子邮件和密码并返回相应的User,否则,如果失败则返回None

@login_manager.request_loader
def load_user(request):
    if "token" in request.args:
        decoded_token = base64.standard_b64decode(request.args["token"])
        email = decoded_token.split(b':',1)[0]
        password = decoded_token.split(b':',1)[1]
        possible_user = User.select().where(User.email == email)[0]
        if possible_user.password.encode() == password:

            return possible_user
        else:
            return None
    else:

        return None
    return None

此令牌在用户登录并发送到仪表板时发送给用户:

  • 用户登录成功
  • 重定向到仪表板
  • 仪表板对受保护的“ / user-data”进行ajax调用,此路由应使用current_user对令牌进行编码,并将其发送回仪表板单页应用程序,以在以后的API调用中使用它。

问题

当我通过仪表板通过AJAX请求“ / user-data”时,current_user为空,即使用户登录了,在我打印时,该调用也会返回401未经授权的请求,即使用户登录了current_user我的当前用户已按预期登录。因此,我的问题是如何保持某种方式来检查登录和“用户数据”路由之间的凭据?我尝试将数据存储在登录路由的会话中,然后在“ / user-data”中重用,但是只要调用“ user-data”,会话就会变为空。

这是“用户数据”路线:

@auth_bp.route("/user-data")
@login_required
def user_data():
    # Return Base 64 encode username:password to use in API calls!
    print("Current user")
    print(current_user)
    print(session)
    code = base64.standard_b64encode(current_user.email.encode() + b':' + current_user.password.encode())
    print(base64.standard_b64decode(code))

    return code

0 个答案:

没有答案
相关问题