Django 是一个流行的 Python Web 框架,而 Google Authenticator 是一种双因素身份验证工具,可以为用户账户提供额外的安全层。在 Django 中实现 Google Authenticator 功能可以增强用户的账户安全性。以下是两种常见的实现方式,每种方式都包括详细的步骤和示例代码。
django-otp
库实现 Google Authenticatordjango-otp
是一个 Django 插件,可以方便地集成双因素身份验证功能。它支持多种身份验证方法,包括 Google Authenticator。
安装 django-otp
和 django-otp-2fa
在终端中运行以下命令来安装所需的库:
pip install django-otp django-otp-2fa
配置 Django 项目
在 Django 项目的 settings.py
文件中,添加 otp
和 django_otp_2fa
到 INSTALLED_APPS
列表中:
INSTALLED_APPS = [
# ...
'otp',
'django_otp_2fa',
# ...
]
创建用户模型
创建一个用户模型,继承自 django_otp_2fa.models.User
,该模型将包含 Google Authenticator 的配置和密钥。
from django_otp_2fa.models import User
from django.contrib.auth.models import AbstractUser
class CustomUser(User):
pass
配置 Google Authenticator
在用户注册或登录时,为用户生成和存储一个 Google Authenticator 密钥。
from django_otp.plugins.otp_totp.models import TOTPDevice
from django_otp.plugins.otp_totp.models import TOTPDevice
def register(request):
# ... 用户注册逻辑 ...
user = CustomUser.objects.create_user(username, password)
totp_device = TOTPDevice.objects.create(user=user)
totp_device.save()
实现双因素验证
在登录时,要求用户输入 Google Authenticator 生成的验证码。
from django_otp.plugins.otp_totp.models import TOTPDevice
from django_otp.plugins.otp_totp.models import TOTPDevice
def login(request):
# ... 用户登录逻辑 ...
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.totpdevice_set.count() > 0:
# 提示用户输入Google Authenticator验证码
# 验证码输入后,使用`verify_token`方法验证验证码是否正确
totp_device = user.totpdevice_set.first()
if totp_device.verify_token(request.POST['token']):
# 验证成功,进行登录操作
login(request, user)
# ...
else:
# 验证失败
# ...
else:
# 用户未配置Google Authenticator
# ...
else:
# 用户认证失败
# ...
如果你想要更多的灵活性和自定义性,你也可以自己实现 Google Authenticator 的集成。以下是一般步骤:
安装 pyotp
库
在终端中运行以下命令来安装 pyotp
库,这是一个用于生成和验证一次性密码的库。
pip install pyotp
生成和存储密钥
在用户注册或设置双因素认证时,生成一个密钥并将其与用户关联存储在数据库中。
from pyotp import random_base32
def setup_2fa(request):
user = request.user
secret_key = random_base32()
user.profile.secret_key = secret_key
user.profile.save()
生成二维码
在用户设置 2FA 时,生成一个二维码,以便用户可以将其扫描到 Google Authenticator 应用中。
import pyotp
import qrcode
from io import BytesIO
def generate_qrcode(request):
user = request.user
totp = pyotp.TOTP(user.profile.secret_key)
uri = totp.provisioning_uri(user.username, issuer_name="MyApp")
img = qrcode.make(uri)
stream = BytesIO()
img.save(stream, "PNG")
return stream.getvalue()
验证验证码
在用户登录时,验证用户输入的验证码是否正确。
from pyotp import TOTP
def login_with_2fa(request):
if request.method == 'POST':
user = authenticate(username=request.POST['username'], password=request.POST['password'])
if user is not None:
if user.profile.secret_key:
totp = TOTP(user.profile.secret_key)
if totp.verify(request.POST['token']):
# 验证成功,进行登录操作
login(request, user)
# ...
else:
# 验证失败
# ...
else:
# 用户未配置2FA
# ...
else:
# 用户认证失败
# ...
这两种方法都可以在 Django 中实现 Google Authenticator 功能,具体的选择取决于你的项目需求和对自定义程度的偏好。请注意,代码示例中的部分细节可能需要根据你的实际项目结构进行调整。