作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我一直在使用 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
在所有其他端点上 <username, password, otp>
保持一致同时认证
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/
我是一名优秀的程序员,十分优秀!