Ragflow允许账号共用

1,387 阅读1分钟

ragflow前端采用的react框架,后端采用的是python的flask框架,通过nginx隐藏端口;

现在的需求是在ragflow的基础上设置公共账号,确保一个账号能在多台设备上登录,目前ragflow的用户逻辑是一个账号只能在一台设备上登录,登录其他设备时,当前设备网页会掉线会登录界面。

单设备登录原因:

ragflow是通过user表中的access_token和status来控制的,在ragflow-0.16.0/api/apps/user_app.pylogin()log_out()方法中,都会对access_token进行修改,然后保存到user表及flask_login中。 在其他接口中会有@login_required特性,在ragflow-0.16.0/api/apps/__init__.pyload_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)

其他注意事项:

  1. ragflow的Authorization是在const authorization = response.headers.get(Authorization); 中获取的。登录成功后,respose的header会更新Authorization。