我陷入了一个循环,我有一个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
此令牌在用户登录并发送到仪表板时发送给用户:
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