在Flask中实现JWT(JSON Web Token)认证,通常需要借助第三方库,比如PyJWT
或Flask-JWT-Extended
。下面我会分别介绍如何使用这两个库来实现JWT认证。
使用PyJWT
- 安装PyJWT
首先,你需要安装PyJWT库。可以使用pip来安装:
pip install PyJWT
- 生成JWT
在Flask应用中,你可以创建一个函数来生成JWT。这个函数通常会接收用户信息(比如用户ID),并使用一个密钥来签名令牌。
import jwt
from datetime import datetime, timedelta
def create_jwt(user_id: int) -> str:
secret_key = "your-secret-key" # 请使用一个安全的密钥
payload = {
'user_id': user_id,
'exp': datetime.utcnow() + timedelta(minutes=30) # 设置令牌过期时间
}
token = jwt.encode(payload, secret_key, algorithm='HS256')
return token
- 验证JWT
你还需要一个函数来验证和解码JWT。这个函数会接收一个令牌和一个密钥,并尝试解码令牌。如果令牌无效或已过期,这个函数会抛出一个异常。
def decode_jwt(token: str) -> dict:
secret_key = "your-secret-key" # 与生成令牌时使用的密钥相同
try:
decoded_token = jwt.decode(token, secret_key, algorithms=['HS256'])
return decoded_token
except jwt.exceptions.DecodeError:
return None # 或者可以抛出一个自定义异常
- 在Flask中使用JWT
你可以在Flask的路由处理函数中使用这些函数来生成和验证JWT。例如,在登录时生成JWT,并在需要身份验证的路由中验证JWT。
使用Flask-JWT-Extended
Flask-JWT-Extended是一个专门为Flask设计的JWT扩展库,它提供了更多高级功能和更好的集成。
- 安装Flask-JWT-Extended
使用pip安装Flask-JWT-Extended:
pip install Flask-JWT-Extended
- 初始化Flask-JWT-Extended
在你的Flask应用中初始化Flask-JWT-Extended:
from flask import Flask
from flask_jwt_extended import JWTManager
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'your-secret-key' # 设置密钥
jwt = JWTManager(app)
- 创建和验证JWT
使用Flask-JWT-Extended提供的装饰器和函数来创建和验证JWT。例如,你可以创建一个登录路由来生成JWT,并使用@jwt_required()
装饰器来保护需要身份验证的路由。
from flask import request, jsonify
from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username', None)
password = request.json.get('password', None)
if username != 'test' or password != 'test':
return jsonify({"msg": "Bad username or password"}), 401
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token), 200
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
current_user = get_jwt_identity()
return jsonify(logged_in_as=current_user), 200
- 运行Flask应用
最后,运行你的Flask应用,并使用Postman或curl等工具来测试JWT认证功能。
标签:Extended,Flask,JWT,jwt,认证,token,key From: https://blog.csdn.net/qq_43472841/article/details/143053740