欢迎访问宙启技术站
智能推送

在Python中使用JWT实现访问令牌和刷新令牌

发布时间:2023-12-27 05:36:01

在Python中使用JWT(JSON Web Token)实现访问令牌和刷新令牌是一种常见的身份验证方式。JWT是由三个部分组成的字符串,分别是头部(header)、载荷(payload)和签名(signature)。

在Python中可以使用PyJWT库来实现JWT的生成和验证。下面是一个使用JWT实现访问令牌和刷新令牌的示例代码:

import jwt
import datetime

# 定义密钥
secret_key = "my_secret_key"

# 定义访问令牌过期时间和刷新令牌过期时间
access_token_expiration = datetime.timedelta(minutes=15)
refresh_token_expiration = datetime.timedelta(days=30)

# 生成访问令牌和刷新令牌
def generate_tokens(user_id):
    access_token_payload = {
        'user_id': user_id,
        'exp': datetime.datetime.utcnow() + access_token_expiration
    }
    access_token = jwt.encode(access_token_payload, secret_key, algorithm='HS256').decode('utf-8')

    refresh_token_payload = {
        'user_id': user_id,
        'exp': datetime.datetime.utcnow() + refresh_token_expiration
    }
    refresh_token = jwt.encode(refresh_token_payload, secret_key, algorithm='HS256').decode('utf-8')

    return access_token, refresh_token

# 验证令牌
def verify_token(token):
    try:
        payload = jwt.decode(token, secret_key, algorithms=['HS256'])
        return payload
    except jwt.ExpiredSignatureError:
        # 令牌已过期
        return None
    except jwt.InvalidTokenError:
        # 令牌无效
        return None

# 示例使用
user_id = 1

# 生成访问令牌和刷新令牌
access_token, refresh_token = generate_tokens(user_id)
print("Access Token:", access_token)
print("Refresh Token:", refresh_token)

# 验证访问令牌
access_token_payload = verify_token(access_token)
if access_token_payload:
    print("Access Token Valid")
    print("User ID:", access_token_payload['user_id'])
else:
    print("Access Token Invalid")

# 验证刷新令牌
refresh_token_payload = verify_token(refresh_token)
if refresh_token_payload:
    print("Refresh Token Valid")
    print("User ID:", refresh_token_payload['user_id'])
else:
    print("Refresh Token Invalid")

以上代码演示了如何生成访问令牌和刷新令牌,并验证其有效性。在生成令牌时,我们指定了过期时间,对于访问令牌通常设置较短的过期时间,对于刷新令牌通常设置较长的过期时间。在验证令牌时,我们捕获了可能发生的过期或无效的异常,并根据情况返回相应的结果。

JWT提供了一种简单和安全的方式来实现身份验证和授权。使用JWT可以避免传统的会话管理,可以在分布式系统和微服务中方便地进行身份验证。但需要注意的是,由于JWT是基于令牌的验证方式,令牌泄露可能导致安全风险,因此需要适当地保护令牌的传输和存储。