我想使用 django_otp 库添加OTP验证。对于每个请求,我都想验证用户是否已被初始身份验证,在这种情况下,请检查用户是否具有任何OTP设备。
我已经手动实现了用于OTP设备创建的API端点,它成功创建了设备并与用于创建的用户相关联。这是我简化的MIDDLEWARE堆栈
MIDDLEWARE = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware',
'oauth2_provider.middleware.OAuth2TokenMiddleware',
'otp.middleware.FMSOTPMiddleware',
)
首先AuthenticationMiddleware
将user
对象添加到请求中,然后OAuth2TokenMiddleware
将针对后端对用户进行 authenticate()。
FMSOTPMiddleware
中间件的代码是:
class FMSOTPMiddleware(OTPMiddleware):
def process_request(self, request, *args, **kwargs):
super().process_request(request, *args, **kwargs)
user = request.user
print(user)
print(user.is_authenticated)
django_otp中的OTPMiddleware
添加了user.otp_device
attr和user.is_verified()
方法。手动添加OTP设备并调用此方法后,它可以正常运行,但在中间件内部
user
始终返回AnonymousUser
。