JWT生成token与反解析

本文详细介绍了JWT(JSON Web Token)的使用方法,包括如何生成和解析JWT,以及JWT的三部分构成——头部、载荷和签名。示例代码展示了使用Python的jwt库进行操作,并解释了每个部分的作用和内容。此外,还阐述了JWT的标准声明、公共声明和私有声明的定义。
摘要由CSDN通过智能技术生成

1、JWT使用:

        ①:生成token:jwt.encode(payload, key,  algorithm)

                        headers:默认为三位字符串,可省略

                        payload:组成的参数字典,类型:dict

                        key:自定义的加密密钥,类型:str

                        algorithm:加密方法(HS256,RSA256等),类型:str

SECRET_KEY = 'scorhl*98f*8fr*vf8vf5'


def GetToken(id, username, auth):
    ADMIN_TOKEN_EXPIRE = 14 * 24 * 60 * 60
    now = int(time.time())
    token = jwt.encode(
        headers={
            'typ': 'POI',
            'alg': 'HS256'
        },
        payload={
            'exp': now + ADMIN_TOKEN_EXPIRE,
            'iat': now,
            'data': {
                'id': id,
                'username': username,
                'auth': auth,
            }
        },
        key=SECRET_KEY,
        algorithm='HS256'
    )
    return token

print('GetToken: \n', GetToken(12, 'scorhl', 1))

结果:

GetToken: 
 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzQwMTQzMzAsImlhdCI6MTYzMjgwNDczMCwiZGF0YSI6eyJpZCI6MTIsInVzZXJuYW1lIjoic2NvcmhsIiwiYXV0aCI6MX19.fGmv0Xyccapm6Mxz2EMu2vn0CWP8JxiCs4qVdCfEMAc

        ②:解析token:jet.decode(jwt, key, algorithms)

                        jwt:生成的token字符串,类型:str

                        key:与encode的key字符串相同,类型:str

                        algorithms:(注意:这个需要加s)与encode的加密方法相同,类型:str

def GetName(token):
    data = jwt.decode(
        jwt=token, 
        key=SECRET_KEY, 
        algorithm='HS256')
    return data

print('GetName: \n', GetName(GetToken(12, 'scorhl', 1)))

结果:

GetName: 
 {'exp': 1634014330, 'iat': 1632804730, 'data': {'id': 12, 'username': 'scorhl', 'auth': 1}}

2、JWT由三部分构成

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).

 header

 jwt的头部承载两部分信息:

  • 声明类型,这里是jwt
  • 声明加密的算法 通常直接使用 HMAC SHA256

 完整的头部就像下面这样的JSON:

{
    'typ': 'POI',
    'alg': 'HS256'
}

然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

playload

载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明

 标准中注册的声明 (建议但不强制使用) :

  • iss: jwt签发者
  • sub: jwt所面向的用户
  • aud: 接收jwt的一方
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间
  • nbf: 定义在什么时间之前,该jwt都是不可用的.
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

公共的声明 :
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

 私有的声明 :

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

定义一个payload:

{
    'id': id,
    'username': username,
    'auth': auth,
}

 然后将其进行base64加密,得到Jwt的第二部分

eyJleHAiOjE2MzQwMTQzMzAsImlhdCI6MTYzMjgwNDczMCwiZGF0YSI6eyJpZCI6MTIsInVzZXJuYW1lIjoic2NvcmhsIiwiYXV0aCI6MX19

 signature

 jwt的第三部分是一个签证信息,这个签证信息由三部分组成: 

  • header (base64后的)
  • payload (base64后的)
  • secret

 这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

fGmv0Xyccapm6Mxz2EMu2vn0CWP8JxiCs4qVdCfEMAc

 密钥secret是保存在服务端的,服务端会根据这个密钥进行生成token和验证,所以需要保护好。

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要使用hutool生成jwt token,你需要在项目中引入hutool-all的依赖。具体的依赖配置如下所示: ```xml <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.13</version> </dependency> ``` 在登录接口中,如果账号密码校验成功,你可以使用用户id和用户类型创建jwt token,并将其设置为永不过期。然后,你可以更新登录日期,并将其作为一个值(B)存储在redis中,以便后续验证。在登录结果中,你可以返回一个json格式的响应,其中包含"result"为"success","token"为A的键值对。用户在接口请求header中携带token进行登录,后端可以通过拦截器解析token,获取userId和用户类型。如果解析失败,则返回一个json响应,表示Token验证不通过。如果解析成功,后端可以验证redis中的缓存key是否存在。如果不存在,则返回一个json响应,表示会话过期请重新登录。如果缓存key存在,则可以自动续7天的超时时间,以实现频繁登录用户的免登陆功能。在接口方法中,你可以直接获取登录用户的信息,将userId和用户类型放入request参数中。如果用户修改密码或退出登录,你可以废除access_tokens,即删除对应的缓存key。\[2\] 请注意,以上是一个大致的流程,具体实现可能会根据你的项目需求有所不同。 #### 引用[.reference_title] - *1* [利用hutool生成和验证JWT的示例](https://blog.csdn.net/qq125281823/article/details/120960181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [JWT生成token及过期和自动续期](https://blog.csdn.net/jq1223/article/details/114580020)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值