python jwt

python jwt

python jwt

什么是JWT

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络间以JSON对象的形式安全地传递信息。它通常用于身份验证和授权,特别适用于分布式应用程序的单点登录场景。

JWT可以包含所需的任何信息,而且是经过数字签名的,因此可以被验证和信任。由于它使用标准的Base64编码,因此可以很容易地在不同的系统之间传递。

JWT的结构

JWT由三部分组成:头部(header)、载荷(payload)和签名(signature)。

头部(Header)

头部包含了JWT的类型(typ)和签名算法(alg),通常是一个JSON对象的形式,例如:

{
  "alg": "HS256",
  "typ": "JWT"
}
JSON

头部会进行Base64编码生成JWT的第一部分。

载荷(Payload)

载荷是JWT的第二部分,用于携带有效的信息。它也是一个JSON对象,可以自定义一些标准的声明,以及一些自定义的声明。标准的声明有:

  • iss(issuer):签发人
  • sub(subject):主题
  • aud(audience):受众
  • exp(expiration time):过期时间
  • nbf(not before):生效时间
  • iat(issued at):签发时间
  • jti(JWT ID):唯一标识符

例如:

{
  "sub": "1234567890",
  "name": "john.doe",
  "admin": true
}
JSON

载荷也会进行Base64编码生成JWT的第二部分。

签名(Signature)

签名是JWT的第三部分,用于验证消息在传递过程中没有被篡改,并且能够验证发送者的身份。

签名的生成需要使用头部和载荷,以及一个秘钥。利用签名算法对头部和载荷进行加密,生成签名。

综合头部、载荷和签名,使用”.”进行连接,就得到了一个JWT。

使用Python生成和解析JWT

在Python中,我们可以使用第三方库PyJWT来生成和解析JWT。

安装PyJWT库

pip install PyJWT
Bash

JWT的生成

使用PyJWT库可以很方便地生成JWT。下面是一个生成JWT的示例代码:

import jwt
import datetime

# 设置头部
header = {
    'typ': 'JWT',
    'alg': 'HS256'
}

# 设置有效载荷
payload = {
    'sub': '1234567890',
    'name': 'John Doe',
    'iat': datetime.datetime.utcnow(),
    'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1)
}

# 设置秘钥
secret_key = 'mysecretkey'

# 生成JWT
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256', headers=header)
print(jwt_token)
Python

上述代码使用了PyJWT库的encode函数来生成JWT。encode函数的参数包括有效载荷、秘钥、算法和头部。

运行上述代码,会输出生成的JWT。例如:

b'eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJIUzI1NiJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE2MjI0MTE3ODMsICJleHAiOiAxNjIyNDIwMzgzfQ.64ZqWRzEXi8tI4ROPp9K-tQEZ6VsVhoAiesInKeR3xM'
Python

JWT的解析

使用PyJWT库可以轻松地解析JWT。下面是一个解析JWT的示例代码:

import jwt

# 设置秘钥
secret_key = 'mysecretkey'

# 输入JWT
jwt_token = input('请输入JWT:')

# 解析JWT
try:
    payload = jwt.decode(jwt_token, secret_key, algorithms=['HS256'])
    print(payload)
except jwt.ExpiredSignatureError:
    print('JWT已过期')
except jwt.InvalidTokenError:
    print('无效的JWT')
Python

上述代码使用了PyJWT库的decode函数来解析JWT。decode函数的参数包括JWT、秘钥和算法。

运行上述代码,会要求输入JWT,然后输出解析得到的有效载荷。如果JWT已过期或无效,则会输出相应的错误信息。

示例代码运行结果

以下是示例代码运行的结果:

生成JWT

b'eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJIUzI1NiJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE2MjI0MTE3ODMsICJleHAiOiAxNjIyNDIwMzgzfQ.64ZqWRzEXi8tI4ROPp9K-tQEZ6VsVhoAiesInKeR3xM'
Python

解析JWT

请输入JWTeyJ0eXAiOiAiSldUIiwgImFsZyI6ICJIUzI1NiJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE2MjI0MTE3ODMsICJleHAiOiAxNjIyNDIwMzgzfQ.64ZqWRzEXi8tI4ROPp9K-tQEZ6VsVhoAiesInKeR3xM
{'sub': '1234567890', 'name': 'John Doe', 'iat': 1622411783, 'exp': 1622420383}
Python

Conclusion

JWT是一种非常实用的身份验证和授权机制,能够安全地在网络间传递信息。使用Python的PyJWT库可以方便地生成和解析JWT,简化了开发过程。希望本文能够帮助你了解JWT的基础知识,并能够在实际项目中应用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册