【问题标题】:How to implement django otp?如何实现 django otp?
【发布时间】:2016-08-02 13:49:30
【问题描述】:

我正在查看django-otp 模块并希望在我的项目中实现它。但我面临几个问题。

1)根据docs(他们在docs中给出的方法),有三个级别的身份验证:AnonymousAuthenticatedAuthenticated + Verified。如果用户已经通过 django 的身份验证系统进行了身份验证,那么他将被要求进行 otp 验证(双向身份验证)。

现在我想跳过它并仅通过 otp 验证/验证用户。代替登录提示,用户将输入电话号码并收到 otp 进行验证。(我想绕过 django 的身份验证)。

2) 我也想在选定的页面上使用otp_required。即,我的网站上将同时拥有匿名用户和经过验证的用户。

3) 我找不到任何关于实现的例子。

我的问题是如何在我当前的场景中实现它。

编辑:Settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'home',
    'django_otp',
    'django_otp.plugins.otp_totp',
    'django_otp.plugins.otp_static',
]

MIDDLEWARE_CLASSES = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django_otp.middleware.OTPMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

【问题讨论】:

  • 这远远超出了 django-otp 的意图。听起来您想编写一个自定义的 Django 身份验证后端。

标签: python django authentication


【解决方案1】:

您可以编写自己的基于类的视图 mixin,例如 LoginRequired mixin

class AuthenticationVerificationMixin(AccessMixin):
    """
    CBV mixin which verifies that the current user is authenticated,
    and has a placeholder for checking if user verified.
    """
    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return self.handle_no_permission()
        elif not request.user.is_verified():
            # If you need a verification logic it will go here,
            # for example here's a redirect if you're not verified...
            # return redirect_to_login(self.request.get_full_path(), '/verify/'), self.get_redirect_field_name())
        return super().dispatch(request, *args, **kwargs)

然后将这些 mixin 添加到您的视图中,例如

class MyView(AuthenticationVerificationMixin, TemplateView):
    ...

【讨论】:

    猜你喜欢
    • 2018-08-10
    • 2021-02-15
    • 2020-02-16
    • 1970-01-01
    • 2017-01-16
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多