首页 > 解决方案 > 在 django-simple-jwt 包中,如何根据不同的签名算法和密钥有条件地验证密码?

问题描述

我的用例是我有一个遗留后端,它使用不安全的密钥生成了令牌。我已经使用 simple-jwt 将所有用户数据导入到一个新的后端。应用程序所有者不想强制现有用户注销并再次登录以获取新令牌。

问题是当现有用户请求令牌时,无法检查他们的旧密码,因为现有哈希是使用旧后端的密钥创建的。因此,我希望 DRF/simple-jwt 首先尝试针对默认密钥/算法进行验证,如果验证失败,则针对旧的、不安全的密钥/算法进行尝试。

这可能吗?我是否基于TokenObtainPair和覆盖创建一个新的序列化程序类validate?如果是这样,我将如何做到这一点?

标签: djangodjango-rest-framework

解决方案


只需将后端添加到您的 Django 设置中的身份验证后端:

AUTHENTICATION_BACKENDS = [
        'path.to.first.auth.backend',
        'path.to.second.auth.backend',
    ]

在文档中它说:

在幕后,Django 维护一个“身份验证后端”列表,用于检查身份验证。当有人调用 django.contrib.auth.authenticate() 时——如如何登录用户中所述——Django 尝试在其所有身份验证后端进行身份验证。如果第一个身份验证方法失败,Django 会尝试第二个,依此类推,直到尝试了所有后端。

https://docs.djangoproject.com/en/3.1/topics/auth/customizing/#specifying-authentication-backends


推荐阅读