在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
我想覆盖或扩展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