在JWT header中添加额外的数据,简单的jwt

Add extra data in JWT header, simple jwt

我想覆盖或扩展Django简单的JWT获取令牌的方法来添加'kid'密钥到令牌header,JWT格式是header.payload.signiture,我知道如何添加它有效载荷,但我需要将其添加到 header,有什么办法吗?

没有干净的方法,因为 simple-jwt 在其核心不支持任何 JWT header 操作。
simple-jwt 提供的令牌 object 是 tokens.Token class 的子 class,每次您从 object 获得编码的 JWT 令牌时,您正在调用使用 token_backend 调用函数将 object 编码为 JWT 的 tokens.Token.__str__ 方法,重写 __str__ 方法很头疼,因为您必须重写几乎所有代码库.
最终的解决方案是编写自定义编码方法并传递令牌 object 并使用 token_backend 进行编码并添加额外的 headers.

def custom_encode_token(token: Token):
        """
            NOTICE THIS IS THE DIRECT METHOD FROM SIMPLE_JWT.BACKENDS.TOKENBACKEND.encode MEHTOD
            ** may clash with next features developed for simple jwt itself
            current release used is ==> 4.6

        Returns an encoded token for the given payload dictionary.
        """
        jwt_payload = token.payload.copy()
        if api_settings.AUDIENCE is not None:
            jwt_payload['aud'] = api_settings.AUDIENCE
        if api_settings.ISSUER is not None:
            jwt_payload['iss'] = api_settings.ISSUER
        token = jwt.encode(
            jwt_payload, 
            api_settings.SIGNING_KEY, 
            algorithm=api_settings.ALGORITHM, 
            headers={'kid': '1'} # HERE WE ADD HEADER TO JWT
        )
        if isinstance(token, bytes):
            # For PyJWT <= 1.7.1
            return token.decode('utf-8')
        # For PyJWT >= 2.0.0a1
        return token