django - 为用户 django 双因素身份验证添加第二个或多个设备

标签 django two-factor-authentication

我正在使用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/

相关文章:

two-factor-authentication - Apple开发人员注册具有两方面身份验证

具有两因素身份验证的 Jenkins SSH

c# - 在 ASP.NET Core 中应用 Microsoft Authenticator App 批准/拒绝 2FA

python - Django 的两个自引用外键

python - Django __init__ 查询集

python - 创建一个假请求以在 django 中将 View 呈现为字符串

authentication - 如何在 Ubuntu 上使用公钥和密码设置 SFTP

python - Django:表单中的电子邮件字段返回 'this field cannot be null/this field cannot be blank',即使其中有地址

Django 管理页面 : Can queryset extra fields be used for sorting specific columns

Gitlab 帐户 2FA 丢失