目前我正在Django应用中尝试实现双因素认证,我做的第一件事是修改UserSerializer
类中的Meta
类,添加两个字段enabled
(表示用户是否启用了双因素认证)和secret_key
(生成OTP的密钥,当用户启用双因素认证时共享给用户)。
为了最小限度地修改登录流程,我修改了发送来生成访问令牌的表单,使其包含一个新字段“OTP”。用户可以填写或不填写该字段,后端将检查用户是否启用了2FA,如果启用了,则检查OTP是否正确。
如果没有2FA,登录只是一个主体为{"username": usr, "password": pwd}
的POST请求。这已经成为一个主体为{"username": usr, "password": pwd, "otp": otp}
的POST请求。如果用户user没有启用2FA,他可以简单地将opt
字段留空。
我的urls.py
看起来像这样:
path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair")
我的想法是重写TokenObtainPairView以适应新的请求。根据我的发现,我必须更改validate
方法,但我并不知道如何执行此操作,我可能需要获取用户的enabled
和secret_key
字段的值(基于用户名)来生成OTP(如果相关),并根据otp
字段检查它。问题是,我不知道如何做到这一点,我在简单的jwt实现中有点迷失。
1条答案
按热度按时间dffbzjpn1#
首先,我不会提供你的问题的全部解决方案,但这可能是一个好的开始。
创建自定义登录视图:
实现您自己的序列化程序,该程序继承TokenObainPairSerializer:
更改网址.py
令牌获取序列化程序如下所示:
因此,您可以在自己的串行化器中实现
__init___
,添加otp字段,并在validate
方法中实现所需的逻辑(您可以在此处访问self.user,并检查他是否启用了2FA)。