`Users` 是否需要存在于 Django 中才能进行 SSO?

Do `Users` need to exist in Django for SSO?

基本上,我正在实现以下功能,前端会将已签名的 JWT 发送到后端。如果后端能够解码并因此验证令牌(即签名、声明、受众等),那么它将允许访问受保护的 API 资源:

现在用户已经存在于 Azure AD 中(所以我不想 create/manage Django 数据库中的用户也存在)。所以基本上我想做的就是用经过验证的访问令牌保护 Django Restful API 端点。我正在查看自定义身份验证(通过扩展 rest_framework.authentication.BaseAuthentication),但似乎 authenticate 方法期望 User 匹配(因此 Users 存在)并返回一个身份验证成功(我想 pass 如果 JWT 验证成功或 raise Exception 是否有错误 ).

Django 文档:

Either way, authenticate() should check the credentials it gets and return a user object that matches those credentials if the credentials are valid. If they’re not valid, it should return None.

我已经使用 method_decorator 实现了我想要的流程(即没有 Django 用户),但这似乎不是正确的身份验证模式:

class ComponentViewSet(viewsets.ModelViewSet):
    queryset = Component.objects.all()
    serializer_class = ComponentSerializer

    @method_decorator(validate_jwt)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

Django 文档还指出:

The Django admin is tightly coupled to the Django User object. The best way to deal with this is to create a Django User object for each user that exists for your backend (e.g., in your LDAP directory, your external SQL database, etc.).You can either write a script to do this in advance or your authenticate method can do it the first time a user logs in.

我还按照文档中的建议,通过在 authenticate 方法中即时创建 Users,单独实现了自定义身份验证。

所以我的问题是,在 Django 中存在 Users 是否是一个强烈推荐的设计(或者必须根据文档),即使您拥有像 [=54 这样的集中管理的身份验证系统=] 等等?或者当您不打算在后端因为我认为它是多余的?如果强烈推荐,在 Django 后端复制用户数据库是否有任何优势。如果这些用户扩展 django.contrib.auth.models.User?

是否也需要密码

无需在每个方法上都使用装饰器,只需创建您自己的 authentication backend。当视图调用 authenticate() 时,Django 会调用 AUTHENTICATION_BACKENDS 中指定的所有后端,直到没有 return None.

关于存储用户,Django 默认假定您要在后端存储会话数据,不需要登录。如果您对每个请求都重新进行身份验证没问题,那么您可以只 return 一个 BaseUser 对象的新实例,而不保存到数据库,尽管其他 Django 功能可能会以意想不到的方式中断。

您可能想探索基于 AbstractUser 甚至 AbstractBaseUser 创建自己的用户模型。如果您没有在每次请求时都获得新令牌,那么将令牌与 when_authenticatedtime_to_expiry

一起存储在用户模型中是有意义的

新用户或 returning 用户when_authenticated + time_to_expiry < now() 访问令牌将通过身份验证服务器进行验证。成功后,更新必要的时间字段以及 current_access_token。刷新中的后续请求 window 只需进行快速相等性检查,而不是向服务器发出另一个请求。

这将使您的身份验证服务器免受大量请求的影响,加快您的 API(每次调用都不会进行身份验证服务器验证),并且仍然可以让您使用 Django 为用户提供的一些很棒的功能.