【问题标题】:Add extra data in JWT header, simple jwt在 JWT 标头中添加额外的数据,简单的 jwt
【发布时间】:2021-06-27 08:16:49
【问题描述】:

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

【问题讨论】:

  • 为什么不将它添加为自定义标题,您可以这样做const header = new Header(); header.append("X-KID", yourKeyValue)
  • 您询问了 DRF-simplejwt,但也将其标记为 PyJWT。对于 DRF,我不知道它是否可能,但对于 PyJWT,它已记录在案:pyjwt.readthedocs.io/en/latest/…@FreduahGideon OP 询问的是 JWT 的标头,而不是 HTTP 标头

标签: python django django-rest-framework-simplejwt


【解决方案1】:

没有干净的方法,因为 simple-jwt 在其核心中不支持任何 JWT 标头操作。
simple-jwt 提供的令牌对象是 tokens.Token 类的子类,每次从对象中获取编码的 JWT 令牌时,您都在调用 tokens.Token.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

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 2022-01-21
    • 2017-05-19
    • 2015-09-05
    • 2021-07-10
    • 2019-12-27
    • 2018-06-26
    • 2018-10-16
    相关资源
    最近更新 更多