DjangoRestFramework_JWT忽略自定义负载处理程序中的负载

DjangoRestFramework_JWT忽略自定义负载处理程序中的负载,django,django-rest-framework,jwt,django-rest-framework-jwt,Django,Django Rest Framework,Jwt,Django Rest Framework Jwt,我为jwt创建了这个自定义jwt_有效负载_处理程序,以便它能够识别密码。如果用户更改了密码,我希望以前的令牌过期。但是,即使我有一个自定义处理程序,出于某种原因,drf jwt忽略了这些更改,并且在我更改用户密码或更改密码\u last\u change字符串值后仍然接受过去的令牌 我是否缺少另一个配置 jwt_有效载荷_处理程序: def jwt_payload_handler(user): username_field = get_username_field() user

我为jwt创建了这个自定义jwt_有效负载_处理程序,以便它能够识别密码。如果用户更改了密码,我希望以前的令牌过期。但是,即使我有一个自定义处理程序,出于某种原因,drf jwt忽略了这些更改,并且在我更改用户密码或更改密码\u last\u change字符串值后仍然接受过去的令牌

我是否缺少另一个配置

jwt_有效载荷_处理程序:

def jwt_payload_handler(user):
    username_field = get_username_field()
    username = get_username(user)
    password_last_change = user.password_last_change  # getting json not serializable error. constant string for now

    warnings.warn(
        'The following fields will be removed in the future: '
        '`email` and `user_id`. ',
        DeprecationWarning
    )

    payload = {
        'user_id': user.pk,
        'username': username,
        'password': user.password,
        'exp': (datetime.utcnow() +  api_settings.JWT_EXPIRATION_DELTA)  ,
        'password_last_change': 'test1',
    }
    if hasattr(user, 'email'):
        payload['email'] = user.email
    if isinstance(user.pk, uuid.UUID):
        payload['user_id'] = str(user.pk)

    payload[username_field] = username

    # Include original issued at time for a brand new token,
    # to allow token refresh
    if api_settings.JWT_ALLOW_REFRESH:
        payload['orig_iat'] = timegm(
            datetime.utcnow().utctimetuple()
        )

    if api_settings.JWT_AUDIENCE is not None:
        payload['aud'] = api_settings.JWT_AUDIENCE

    if api_settings.JWT_ISSUER is not None:
        payload['iss'] = api_settings.JWT_ISSUER

    return payload

我想出来了。我们需要在settings.py文件中设置
jwt\u GET\u USER\u SECRET\u KEY
值,而不是自定义jwt\u payload\u handler函数。默认情况下,它是None,但它接受一个函数,该函数将用户作为参数并返回uuid字符串。如果未配置,conf django密钥将用于所有用户。但如果设置,每个用户都将拥有自己的密钥

在更改密码时,还要更新uuid

在用户模型中,我们可以将某些字段设置为:

class TestUser(AbstractBaseUser):
    jwt_secret = models.UUIDField(default=uuid.uuid4)
功能示例:

def jwt_get_secret_key(user_model):
    return user_model.jwt_secret 
在设置中:

JWT_AUTH = {
    ...
    'JWT_GET_USER_SECRET_KEY': 'path.to.jwt_get_secret_key'
    ...
}
因此,在您的视图或信号中,在调用set_password方法后: 您可以将user.secret\u jwt设置为新值:

user.secret_jwt = uuid.uuid4()
user.save()
这将使以前的所有请求无效