python - 在 JWT 标头中添加额外的数据,简单的 jwt
问题描述
我想覆盖或扩展 Django 简单 JWT 获取令牌方法以将 'kid' 键添加到令牌标头,JWT 格式为 header.payload.signiture,我知道如何将其添加到有效负载但我需要将其添加到标头,有什么办法吗?
解决方案
没有干净的方法,因为 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
推荐阅读
- sql - Performance: WHERE IN clause vs (INSERT + INNER JOIN)
- android - 保留版本的 targetSdkVersion 限制
- php - Symfony 3 +__isInitialized__: false
- vba - VBA Word 无法插入换行符
- jquery - JQUERY - how to make text display as its containing div box is sliding left to right?
- r - R ggplot2:如何将美学参数用作函数的一部分?
- reactjs - why ontouchstart event triggers the handler twice in react?
- regex - How to extract the code value only from bean shell extractor
- bash - grep 排除模式并排除前 2 行
- react-native - 使用 react-navigation 禁用滑动手势打开导航抽屉