我正在使用two-factor authentication对于 Django 项目。它工作正常,但我想在我的代码中实现更多功能。但我无法实现
预期行为:
我希望每当用户从新设备登录时都必须面对 2F 身份验证提示。另外,我想增加代码验证时间。
当前行为: 目前,如果用户首次登录,系统会向用户显示身份验证提示。但是当用户从新设备登录时,不会向用户显示身份验证并轻松登录。但我希望用户必须面对每个新设备的 2F。另外,每当我更改步骤时,验证代码都无效。例如,如果我给出step=60,那么验证码就会无效。我无法增加代码验证的时间。
我检查了数据库中的 TOTPDevice 模型。它表明现在没有为新设备生成新 key 。
我正在使用以下代码。
def get_user_totp_device(self, user, confirmed=None):
"""
Gets user's time based one-time password devices
"""
devices = devices_for_user(user, confirmed=confirmed)
for device in devices:
if isinstance(device, TOTPDevice):
return device
class TOTPCreateView(APIView):
permission_classes = []
def post(self, request):
username = request.data['username']
user = User.objects.get(username=username)
user_email = user.email
user_device = request.META.get('HTTP_USER_AGENT', '')
time = datetime.now().strftime("%H:%M:%S")
if not user.is_anonymous:
device = get_user_totp_device(self, user)
if not device:
device = user.totpdevice_set.create(confirmed=False)
secret_key = device.bin_key
totp = pyotp.TOTP(base64.b32encode(secret_key))
one_time_password = totp.now()
url = device.config_url
response_status = status.HTTP_201_CREATED
else:
url = {}
response_status = status.HTTP_401_UNAUTHORIZED
return Response(url, status=response_status)
class TOTPVerifyView(APIView):
permission_classes = []
def post(self, request, token, format=None):
username = request.data['username']
user = User.objects.get(username=username)
device = get_user_totp_device(self, user)
if not user.is_anonymous:
device_registered = device.verify_token(token)
if device_registered:
if not device.confirmed:
device.confirmed = True
device.save()
data = True
response_status = status.HTTP_200_OK
else:
data = {'error': 'Verification code is not valid'}
response_status = status.HTTP_400_BAD_REQUEST
else:
data = False
response_status = status.HTTP_401_UNAUTHORIZED
return Response(data, status=response_status)
最佳答案
我能想到的最简单的方法是创建一个新表并在该表中针对该用户存储诸如 machine_id
之类的内容。然后,您可以创建一个 permission_class
或一个 decorator
来检查用户是在新机器上还是在具有相同 machine_id
的旧机器上数据库。在这种情况下,您将转到 View 的其余部分并返回任何内容。另一方面,如果用户使用新计算机,您可以将他们重定向到 2FA
页面,然后针对该用户在数据库中添加该新计算机。
我能想到的另一种方法是在前端添加内容,但不建议您让前端从本地存储向您发送一些验证凭据,如果这些凭据不存在,您就知道用户要么使用新的设备或长时间后访问或其他什么。在这种情况下,您将它们重定向到 2FA
页面。
我希望我解释得很好。
关于django - 为用户 django 双因素身份验证添加第二个或多个设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68246721/