`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_authenticated
、time_to_expiry
等
一起存储在用户模型中是有意义的
新用户或 returning 用户when_authenticated + time_to_expiry < now()
访问令牌将通过身份验证服务器进行验证。成功后,更新必要的时间字段以及 current_access_token
。刷新中的后续请求 window 只需进行快速相等性检查,而不是向服务器发出另一个请求。
这将使您的身份验证服务器免受大量请求的影响,加快您的 API(每次调用都不会进行身份验证服务器验证),并且仍然可以让您使用 Django 为用户提供的一些很棒的功能.
基本上,我正在实现以下功能,前端会将已签名的 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_authenticated
、time_to_expiry
等
新用户或 returning 用户when_authenticated + time_to_expiry < now()
访问令牌将通过身份验证服务器进行验证。成功后,更新必要的时间字段以及 current_access_token
。刷新中的后续请求 window 只需进行快速相等性检查,而不是向服务器发出另一个请求。
这将使您的身份验证服务器免受大量请求的影响,加快您的 API(每次调用都不会进行身份验证服务器验证),并且仍然可以让您使用 Django 为用户提供的一些很棒的功能.