优秀的编程知识分享平台

网站首页 > 技术文章 正文

Python:JWT介绍(python jvm)

nanyue 2024-08-17 19:13:51 技术文章 23 ℃

一、JWT简介和使用场景

二、JWT编码

三、JWT解码

四、JWT生成token验证

一、 JWT简介和使用场景

JWT全称为Json Web Token,用以Json的方式传输信息,使用秘钥(HMAC算法)/RSA/ECDSA的公钥和私钥进行签名。

用户登录后,每次请求时,客户端都携带JWT生成的Token到服务器,服务器经过计算验证,确定该信息是否合法从而进行鉴权,简单理解为在客户端和服务端通过Json格式传递鉴权信息,与Session不同,JWT不需要存储在服务端。

二、JWT编码

JWT编码即生成TOKEN:

1.headers

headers={"alg":"HS256", #使用的算法
       "typ": "JWT"   #TOKEN类别
       }

2.pyload

  • 共有声明(按需要添加,一般是用exp)

{

'exp' : xxx, #生成token的过期时间的时间戳

'iss' : xxx, #token的签发者

'iat' : xxx, #创建时间的时间戳

'aud': xxx #token签发面向的群体

}

  • 私有声明(自定义key,value)

{

'username' :'rachel'

}

查看代码

class jwt_operate():

   def __init__(self):
      self.salt='123456'
      self.exp=time.time()+60*60*12
   #生成token
   def jwt_encode(self):
      headers={"alg":"HS256", #使用的算法
             "typ": "JWT"   #TOKEN类别
             }
      pyload={"name":"john Doe", "exp":self.exp }
      token=jwt.encode(payload=pyload,key=self.salt,headers=headers,algorithm='HS256')
      print(token)
      return token

结果如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiam9obiBEb2UiLCJleHAiOjE2OTg5NzQ0MDMuNzgxNDg1M30.N3aiqpxgW6d-rtxfxPLpYbtzVB0vFZv6S59sAawqW54

三、JWT解码

对“二、JWT编码”中的生成的token进行解密,代码过程:

def jwt_decode(self):
   token=self.jwt_encode()
   pyload=jwt.decode(token,key=self.salt,algorithms='HS256',options={"verify_signature": False})
   print(pyload)

四、JWT生成token验证

token验证的官网:JSON Web Tokens - jwt.io

如上图所示,生成的token是一串base64编码,通过点号"."分割成三部分,分别为:Header,Pyload,Signature。

Header,Pyload仅进行了BASE64编码,可以用BASE64解码,所以不要存储敏感信息。Signature是把Header和Pyload密文通过“.”拼接起来,然后进行HS256加密,然后再进行base64url加密,最终得到token的第三段。

代码实现:

def test_token(self):
   token=self.jwt_encode()
   header,pyload,sign=token.split('.')
   header_pyload=token.rsplit('.',1)[0]
   print(header,pyload,sign)
   #header解码
   dec_headers=base64.b64decode(header).decode('utf-8')
   print(dec_headers)
   #pyload解码
   remainder=4-len(pyload)%4
   if remainder:
      pyload+="="*remainder
   dec_pyload=base64.b64decode(pyload).decode('utf-8')
   print(dec_pyload)
   message=header_pyload.encode("utf-8")
   key=self.salt.encode("utf-8")
   hm=hmac.new(key,message,digestmod=sha256)
   sign=base64.b64encode(hm.digest()).decode()
   print(sign)

运行结果:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 eyJuYW1lIjoiam9obiBEb2UiLCJleHAiOjE2OTkwMjExODkuNzA4NDk3NX0 VAbVJ4XQ061Rm3qTQsO0rQdduAVhCjWdStkoNat_vmE
{"alg":"HS256","typ":"JWT"}
{"name":"john Doe","exp":1699021189.7084975}
VAbVJ4XQ061Rm3qTQsO0rQdduAVhCjWdStkoNat_vmE=

Tags:

最近发表
标签列表