首页 > 解决方案 > 在 JWT 标头中添加额外的数据,简单的 jwt

问题描述

我想覆盖或扩展 Django 简单 JWT 获取令牌方法以将 'kid' 键添加到令牌标头,JWT 格式为 header.payload.signiture,我知道如何将其添加到有效负载但我需要将其添加到标头,有什么办法吗?

标签: pythondjangodjango-rest-framework-simplejwt

解决方案


没有干净的方法,因为 simple-jwt 在其核心中不支持任何 JWT 标头操作。
simple-jwt 提供的令牌对象是 tokens.Token 类的子类,每次您从调用 tokens.Token 的对象中获取编码的 JWT 令牌时。str方法使用 token_backend 调用函数将对象编码为 JWT,重写str方法是一个令人头疼的问题,因为您必须重写几乎所有的代码库。
最终的解决方案是编写自定义编码方法并传递 Token 对象并使用 token_backend 进行编码并添加额外的标头。

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

推荐阅读