Python 语言 用 Flask+JWT 实现 API 身份认证 令牌刷新 + 黑名单机制

Python阿木 发布于 21 小时前 2 次阅读


使用 Flask 和 JWT 实现API身份认证:令牌刷新与黑名单机制

在Web应用程序中,身份认证是确保数据安全和用户隐私的重要环节。随着RESTful API的广泛应用,使用JWT(JSON Web Tokens)进行API身份认证已成为一种流行的方式。本文将介绍如何使用Flask框架结合JWT实现API身份认证,包括令牌刷新和黑名单机制。

准备工作

在开始之前,请确保您已经安装了以下Python库:

- Flask
- PyJWT
- Flask-JWT-Extended

您可以使用以下命令安装这些库:

bash
pip install Flask PyJWT Flask-JWT-Extended

创建Flask应用

我们需要创建一个基本的Flask应用。以下是创建Flask应用的代码:

python
from flask import Flask

app = Flask(__name__)

if __name__ == '__main__':
app.run(debug=True)

配置JWT

接下来,我们需要配置JWT。这包括设置密钥、过期时间和刷新令牌的过期时间。以下是配置JWT的代码:

python
from flask_jwt_extended import JWTManager

app.config['JWT_SECRET_KEY'] = 'your-secret-key'
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = 3600 1小时
app.config['JWT_REFRESH_TOKEN_EXPIRES'] = 86400 24小时

jwt = JWTManager(app)

创建用户模型

为了进行身份认证,我们需要一个用户模型。以下是使用Flask-SQLAlchemy创建用户模型的代码:

python
from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), unique=True, nullable=False)
password = db.Column(db.String(50), nullable=False)

def __init__(self, username, password):
self.username = username
self.password = password

def check_password(self, password):
return self.password == password

创建用户注册和登录路由

现在,我们可以创建用户注册和登录的路由。以下是创建这些路由的代码:

python
from flask import request, jsonify
from werkzeug.security import generate_password_hash, check_password_hash

@app.route('/register', methods=['POST'])
def register():
username = request.json.get('username')
password = request.json.get('password')
if not username or not password:
return jsonify({'message': 'Missing username or password'}), 400
if User.query.filter_by(username=username).first():
return jsonify({'message': 'Username already exists'}), 400
hashed_password = generate_password_hash(password)
new_user = User(username=username, password=hashed_password)
db.session.add(new_user)
db.session.commit()
return jsonify({'message': 'User created successfully'}), 201

@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username')
password = request.json.get('password')
user = User.query.filter_by(username=username).first()
if not user or not user.check_password(password):
return jsonify({'message': 'Invalid username or password'}), 401
access_token = jwt.create_access_token(identity=username)
refresh_token = jwt.create_refresh_token(identity=username)
return jsonify({'access_token': access_token, 'refresh_token': refresh_token}), 200

创建令牌刷新路由

为了实现令牌刷新,我们需要创建一个路由,允许用户使用刷新令牌来获取新的访问令牌。以下是创建这个路由的代码:

python
@app.route('/token/refresh', methods=['POST'])
@jwt_refresh_token_required
def refresh():
current_user = get_jwt_identity()
access_token = jwt.create_access_token(identity=current_user)
return jsonify({'access_token': access_token}), 200

创建黑名单机制

为了防止令牌被滥用,我们需要实现一个黑名单机制。以下是创建黑名单机制的代码:

python
from flask_jwt_extended import set_access_token_blacklist

blacklist = set()

@app.route('/logout', methods=['POST'])
def logout():
access_token = request.headers.get('Authorization').split(' ')[1]
blacklist.add(access_token)
set_access_token_blacklist(access_token)
return jsonify({'message': 'Successfully logged out'}), 200

总结

本文介绍了如何使用Flask和JWT实现API身份认证,包括令牌刷新和黑名单机制。通过以上步骤,您可以创建一个安全的API,保护您的应用程序免受未经授权的访问。

请注意,本文提供的代码仅供参考,实际应用中可能需要根据具体需求进行调整。为了提高安全性,建议使用更复杂的密码哈希算法和更安全的密钥。