当我们使用Django(Existing proj)进行身份验证而使用FastAPI(新功能)进行API时,如何识别并保存正确的"user"?

How to identify and save the right "user" when we use Django (Existing proj) for authentication and FastAPI (new feature) for API's?

大家好,我有一个现有的 Django 项目,它具有某些功能并且还具有用户数据。对于某些功能,用户使用通过 Django 提供的 API(也是身份验证),但是由于需要通过 FastAPI 实现的新功能,我需要有相同的用户验证或(更好地说)被 FastAPI(作为 Django 中的同一用户)识别,以保存或检索与数据库中的用户对应的操作(通过 FastAPI)。

如何实现?如何安全地为每个用户存储用户数据,例如 user_idusername?如何正确设计数据库table?

请告诉我如何开始。

谢谢。

假设您已经实现了自己的 AbstractUser 子 class 命名为 DannyUser,那么您有几个选择:

  • 将所有需要的信息嵌入到新字段中(例如 JSONField subclass)——不推荐这样做,因为这会将随机信息泄漏到管家 table 并且在我看来是不明智的。

  • 为每个身份验证服务设计一个新模型,并通过外键和反向关系将其绑定到您的 DannyUser 实例。然后你可以在需要的地方使用类似 my_danny_instance.fastapi_account.auth_token 的东西。这也将允许您加密特定字段或稍后使用秘密管理解决方案。

在合理的范围内简单地规范化您的数据。

这主要是一个软件架构设计问题,在您的旧登录端点中,将新 FastAPI 项目所需的所有数据放入 JWT 令牌负载中(例如 user_id、user_name 等) ,签名并交给用户:

# using PyJWT
import jwt
user_token = jwt.encode(
     {"user_id": "1222", "user_name": "yosef", },
     "YOUR_SECRET_KEY",
     algorithm="HS256",
     headers={},
)

然后在新的 FastAPI 项目端点中,使用您在 Django 登录端点中签名的密钥验证请求 header 中的 JWT 令牌:

# using PyJWT
import jwt

try:
    data = jwt.decode(JWT_STRING_VAR, "YOUR_SECRET_KEY", algorithms=["HS256"])
except jwt.ExpiredSignatureError:
    # reject
    ...

如果令牌有效,您接受请求并使用有效负载作为确认数据来执行您通常的端点功能,如果标志无效,则拒绝请求。
这样,您根本不需要更改旧端点。
*注意:除了 PyJWT,您还可以使用 SimpleJWT 或任何其他用于 Django 的包,以及用于 FastAPI
的 suitable JWT 包 **注意:当您的 JWT 负载可能在 JWT 到期之前发生更改时,这种情况可能会变得非常复杂,例如 user_name 发生更改但您无法在 JWT 中更改它并且用户可以在您的其他服务中使用旧数据,关于这个有更多的解决方案,比如删除可能从有效负载中更改的属性并直接从数据库中获取它们,这意味着你从 FastAPI 查询 Django populated table,你可以通过 import dynamic tables 来实现在 SQLAlchemy 中 ***注:系统设计架构图