gpt4 book ai didi

python - Django/Django Rest 如何在每次登录时保存用户设备以防止繁琐的 2FA?

转载 作者:行者123 更新时间:2023-12-04 11:29:12 27 4
gpt4 key购买 nike

您好,我一直在使用 JWT 作为身份验证框架的 Django Rest Framework,并且我成功地进行了基于电子邮件 OTP 的两因素身份验证登录,但我想改进的一件事是我想改进登录并保存用户的设备,以便重复 2FA(双因素身份验证)可以最小化吗?
这是我为在用户电子邮件上发送 otp 所做的某些代码实例。
序列化程序.py

class UserLoginSerializer(serializers.Serializer):
email = serializers.EmailField()
password = PasswordField()
View .py
class UserLoginView(generics.CreateWithMessageAPIView):
"""
Use this end-point to get login for user
"""
message = _('Please check your email for 6 digit OTP code.')
serializer_class = serializers.UserLoginSerializer

def perform_create(self, serializer):
usecases.UserLoginWithOTPUseCase(self.request, serializer=serializer).execute()
用例.py
class UserLoginWithOTPUseCase(CreateUseCase, OTPMixin):
def __init__(self, request, serializer):
self._request = request
super().__init__(serializer)

def execute(self):
self._factory()

def _factory(self):
credentials = {
'username': self._data['email'],
'password': self._data['password']
}
self._user = authenticate(self._request, **credentials)
if self._user is not None:
"""
Sends email confirmation mail to the user's email
:return: None
"""
code = self._generate_totp(
user=self._user,
purpose='2FA',
interval=180
)

EmailVerificationEmail(
context={
'code': code,
'uuid': self._user.id
}
).send(to=[self._user.email])
else:
raise PermissionDenied(
{
'authentication_error': _('User name or password not matched')
}
)
我很困惑如何允许或保存设备以防止重复 2FA。

最佳答案

TLDR;
在非常高的层次上:标记 OTP(将 otp 换成 JWT)。
解释
一个 JWT无非是一个 JSON 签名 带有一些标准化字段的有效载荷 exp (过期), nbf (不是之前),etc... .签名(对称或非对称)确保完整性、真实性和不可否认性(例如, token 已由我们认为的人发行且未被更改)。
JWT您可以放置​​任何内容(请记住该值未加密),包括应用程序逻辑所需的数据。您也可以交换不同的JWT在不同的身份验证步骤中。
一些例子
延期2FA

  • 用户给你 <username, password>如果有效,它会收到 type_1_jwt如果启用了 2FA,否则是 type_2_jwt
  • 用户给你 <type_1_jwt, otp>如果两者都有效,它会收到 type_2_jwt
  • 您的应用仅接受 type_2_jwt在所有其他端点上

  • 在这里,您可以在初始用户身份验证后(或者即使检测到可疑设备)灵活地请求 OTP。如果需要 OTP,则用户不需要再次插入密码,而且密码永远不会存储在任何地方,也不会在任何 future 的请求中重新提交。安全级别与 <username, password, otp>保持一致同时认证
    更新 token
  • 用户进行身份验证并收到 renew_jwt (长期或永不过期)
  • 用户交流 renew_jwt对于 auth_jwt (快到期)
  • 您的应用仅接受 auth_jwt在所有其他端点上

  • 如果您希望撤销或更改身份验证(更改角色),则此解决方案具有很大的灵活性。您可以拥有 auth_jwt在您的整个应用程序中使用但过期非常快,那么您有一个 renew_jwt已被交易以进行适当的身份验证并可用于自动请求 auth_jwt ,只有在满足某些条件(例如身份验证未被撤销)时,系统才会满足此请求。
    混合在一起
  • 用户给你 <username, password, otp>它收到一个 auth_jwt (或 renew_jwt )和 otp_jwt .
  • 用户给你 <username, password, otp_jwt>
  • 您的应用仅接受 auth_jwt在所有其他端点上

  • 第一次身份验证后,用户设备会收到 otp_jwt (具有任意长的持续时间)并且可以存储在设备上(cookies、appStorage、secureStorage,...)。此 otp_jwt可以在以后的任何时刻使用(连同用户名和密码)再次进行身份验证。
    从概念上讲 otp_jwt token 是用户过去已成功通过 OTP 进行身份验证的安全证明
    假设设备可以被认为是相当安全的,这种策略不会显着增加未经授权访问的风险。但请记住,您应该始终为用户提供一个选项 completely log out例如也清除这个 token 。

    关于python - Django/Django Rest 如何在每次登录时保存用户设备以防止繁琐的 2FA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69190210/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com