ragflow前端采用的react框架,后端采用的是python的flask框架,通过nginx隐藏端口;
现在的需求是在ragflow的基础上设置公共账号,确保一个账号能在多台设备上登录,目前ragflow的用户逻辑是一个账号只能在一台设备上登录,登录其他设备时,当前设备网页会掉线会登录界面。
单设备登录原因:
ragflow是通过user表中的access_token和status来控制的,在ragflow-0.16.0/api/apps/user_app.py的login()和log_out()方法中,都会对access_token进行修改,然后保存到user表及flask_login中。
在其他接口中会有@login_required特性,在ragflow-0.16.0/api/apps/__init__.py的load_user()方法中,会对用户的Authorization进行校验。
# login()
user = UserService.query_user(email, password)
if user:
response_data = user.to_json()
user.access_token = get_uuid()
login_user(user)
user.update_time = (current_timestamp(),)
user.update_date = (datetime_format(datetime.now()),)
user.save()
msg = "Welcome back!"
return construct_response(data=response_data, auth=user.get_id(), message=msg)
@manager.route("/logout", methods=["GET"]) # noqa: F821
@login_required
def log_out():
current_user.access_token = ""
current_user.save()
logout_user()
return get_json_result(data=True)
解决办法:
确保access_token一经创建便不再修改,且jwt的secret_key保持不变。
# login
user = UserService.query_user(email, password)
if user:
response_data = user.to_json()
if (user.access_token is None or user.access_token == ""):
user.access_token = get_uuid()
user.update_time = (current_timestamp(),)
user.update_date = (datetime_format(datetime.now()),)
user.save()
login_user(user)
@manager.route("/logout", methods=["GET"]) # noqa: F821
@login_required
def log_out():
# current_user.access_token = ""
# current_user.save()
logout_user()
return get_json_result(data=True)
其他注意事项:
- ragflow的Authorization是在
const authorization = response.headers.get(Authorization);中获取的。登录成功后,respose的header会更新Authorization。