JWT(JSON Web Token)是一种用于进行身份认证的令牌,在 Web 应用中广泛使用。为了方便使用,我们可以对 JWT 进行封装,提供统一的接口。
下面展示一个简单的 JWT 封装和使用的示例。
封装 JWT
import jwt
class Jwt:
key = 'your_secret_key'
@classmethod
def encode(cls, payload, exp=3600):
payload['exp'] = int(time.time() + exp)
token = jwt.encode(payload, cls.key, algorithm='HS256')
return token.decode()
@classmethod
def decode(cls, token):
try:
payload = jwt.decode(token, cls.key, algorithms=['HS256'])
return payload
except jwt.ExpiredSignatureError:
raise Exception('Token expired')
except jwt.DecodeError:
raise Exception('Token invalid')
使用 JWT
from app import app, Jwt
@app.route('/login', methods=['POST'])
def login():
# 验证用户名和密码
if not check_username_and_password(username, password):
return {'error': 'Invalid username or password'}, 400
# 生成 Token
payload = {'username': username, 'role': role}
token = Jwt.encode(payload)
# 返回 Token
return {'token': token}, 200
@app.route('/api', methods=['GET'])
def api():
# 验证 Token
header = request.headers.get('Authorization')
if not header:
return {'error': 'No Authorization header'}, 401
token = header.split(' ')[1]
try:
payload = Jwt.decode(token)
except Exception as e:
return {'error': str(e)}, 401
# 使用 Token 中的信息进行授权
if not check_permission(payload['role']):
return {'error': 'Permission denied'}, 403
# 返回数据
return {'data': 'Hello, ' + payload['username']}, 200
在这个示例中,我们首先定义了一个 Jwt 类,其中包含了对 JWT 的封装函数:encode 和 decode。encode 函数用于生成 Token,decode 函数用于解密 Token。在 encode 函数中,我们还可以指定有效期(单位为秒),默认为 3600 秒。这些函数会在应用中多次使用,因此封装起来方便统一管理。
在应用中,我们可以像上面的示例一样使用 Jwt 类来生成和解密 Token。在登录接口中,我们生成 Token 并返回给客户端,客户端可以将 Token 存储在本地,在后续请求中携带到服务端。在 API 接口中,我们首先从 HTTP 头部中获取 Token,然后进行解密和验证,最终使用 Token 中的信息进行授权和数据获取。