JSON Web Token (JWT) 是一种用于跨网络传输数据的开放标准(RFC 7519),可以在用户和服务器之间安全地传输信息。在实际应用中,使用JWT可以方便地实现身份验证和信息传递,并且提供了一种安全可靠的方法来确保传输的数据不被篡改。
简单示例
在Python中,可以使用PyJWT库来进行JWT的编码和解码操作。
- 创建一个JWT令牌:
import jwt
import datetime
# 设置JWT的有效载荷(Payload)
payload = {
'user_id': 12345,
'username': 'example_user',
'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1) # 设置过期时间为1天后
}
# 选择一个密钥来签名JWT
secret_key = 'your_secret_key'
# 生成JWT令牌
token = jwt.encode(payload, secret_key, algorithm='HS256')
print(token)
- 解码和验证JWT令牌:
import jwt
# 要验证的JWT令牌
token = 'your_generated_token'
# 选择之前使用的相同密钥来验证JWT
secret_key = 'your_secret_key'
try:
# 解码和验证JWT
decoded_payload = jwt.decode(token, secret_key, algorithms=['HS256'])
print(decoded_payload)
except jwt.ExpiredSignatureError:
print('JWT令牌已过期')
except jwt.InvalidTokenError:
print('无法验证JWT令牌')
以上代码将尝试解码和验证之前生成的JWT令牌,并打印出有效载荷(Payload)。如果JWT令牌已过期或无法验证,则会捕获对应的异常并进行处理。
JWT令牌的结构
JWT 生成的字符串中包含了三个由点号(.)分隔的部分:头部(Header)、载荷(Payload)、签名(Signature)。这些部分共同构成了JWT令牌的结构。
-
头部(Header):头部包含了描述关于该JWT的元数据信息及所使用的签名算法的信息。头部通常包含两部分:令牌类型(JWT)和所使用的算法(例如HMAC SHA256或RSA)。头部采用 Base64 编码,并且不会进行加密。一个头部示例可能如下所示:
{ "alg": "HS256", "typ": "JWT" }
-
载荷(Payload):载荷包含了有关用户或其他实体的信息,以及其他元数据。载荷同样采用 Base64 编码,不过也不会进行加密。载荷通常包含了一些预定义的声明(例如身份标识、过期时间等),同时也可以包含自定义的声明。一个载荷示例可能如下所示:
{ "user_id": 12345, "username": "example_user", "exp": 1611927582 }
-
签名(Signature):签名是由头部和载荷通过指定的算法计算得出的,并使用密钥进行签名。签名用于验证消息的完整性,并确保消息在传输过程中没有被篡改。签名的算法通常由头部中的 “alg” 字段指定。一个签名示例可能如下所示:
hmacSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret_key )
这就是JWT生成的字符串中三个点所代表的部分。在解码JWT时,这些部分会被分隔开来,以便进行相应的处理和验证。