使用 Flask JWT 实现身份验证和授权

文章目录

在 Web 开发中,身份验证(Authentication)和授权(Authorization)是非常关键的功能。为了实现这两个功能,我们可以使用 Flask JWT(JSON Web Tokens)库。JWT 是一种用于在网络应用之间安全传输信息的开放标准,它基于 JSON 格式,可以实现在服务器和客户端之间安全传递被加密的信息。

本文将介绍如何使用 Flask JWT 来添加身份验证和授权功能到你的 Flask 应用中。

安装依赖

首先,我们需要安装 Flask JWT。打开终端,运行以下命令:

shell 复制代码
pip install flask-jwt

导入必要的模块和库

在你的 Flask 应用中,导入必要的模块和库:

python 复制代码
from flask import Flask, request
from flask_jwt import JWT, jwt_required, current_identity
from werkzeug.security import safe_str_cmp

创建 Flask 应用

接下来,创建一个 Flask 应用实例:

python 复制代码
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'  # 设置密钥

创建用户模型和用户存储

我们需要创建一个用户模型来表示应用中的用户,并创建一个用户存储来存储用户信息。这里我们简单起见,使用一个字典来存储用户信息:

python 复制代码
users = {
    'admin': {'password': 'admin'}
}

实现认证回调函数

Flask JWT 需要一个认证回调函数来根据用户名和密码验证用户。我们可以使用 jwt_required 装饰器来标记需要进行身份验证的路由:

python 复制代码
@jwt.authentication_handler
def authenticate(username, password):
    user = users.get(username)
    if user and safe_str_cmp(user['password'].encode('utf-8'), password.encode('utf-8')):
        return user

@jwt.identity_handler
def identity(payload):
    user_id = payload['identity']
    return users.get(user_id)

实现登录和获取令牌的路由

我们可以使用 /login 路由来处理登录请求,返回一个包含 JWT 的 JSON 响应:

python 复制代码
@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']
    user = authenticate(username, password)
    if user:
        token = jwt.jwt_encode_callback(user)
        return {'token': token.decode('utf-8')}
    else:
        return {'error': 'Invalid credentials'}, 401

添加保护的路由

使用 jwt_required 装饰器可以很容易地保护需要授权才能访问的路由:

python 复制代码
@app.route('/protected')
@jwt_required()
def protected():
    return {'message': f'Hello, {current_identity}'}

运行应用

最后,运行应用并访问相关路由即可测试身份验证和授权功能:

shell 复制代码
flask run

以上就是使用 Flask JWT 实现身份验证和授权的基本步骤。通过 JWT,我们可以轻松地在 Flask 应用中添加安全的身份验证和授权功能。

注意:在实际开发中,请使用更复杂的用户存储方式和密码加密算法来增强安全性。

拓展

除了基本的身份验证和授权功能,Flask JWT 还可以进行一些拓展,下面介绍其中两个常用拓展:

JWT 刷新

JWT 刷新是指在访问令牌过期之后,使用刷新令牌来获取新的访问令牌。这里我们可以使用 Flask JWT 的 jwt_refresh_token_required 装饰器来保护需要刷新令牌的路由,并使用 jwt_refresh_token_handler 回调函数实现刷新令牌功能:

python 复制代码
@jwt.jwt_refresh_token_required
def refresh():
    current_user = get_jwt_identity()
    new_token = create_access_token(identity=current_user)
    return {'access_token': new_token}, 200

自定义过期时间

默认情况下,Flask JWT 访问令牌的有效期为 15 分钟,刷新令牌的有效期为 30 天。如果需要自定义过期时间,我们可以通过配置 JWT_ACCESS_TOKEN_EXPIRESJWT_REFRESH_TOKEN_EXPIRES 参数来实现:

python 复制代码
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = datetime.timedelta(minutes=30)
app.config['JWT_REFRESH_TOKEN_EXPIRES'] = datetime.timedelta(days=30)

以上就是使用 Flask JWT 实现身份验证和授权时的一些常用拓展。通过这些拓展,我们可以更加灵活地使用 Flask JWT 来满足不同的需求。

相关推荐
计算机编程小咖31 分钟前
《基于大数据的农产品交易数据分析与可视化系统》选题不当,毕业答辩可能直接挂科
java·大数据·hadoop·python·数据挖掘·数据分析·spark
zhangfeng11332 小时前
以下是基于图论的归一化切割(Normalized Cut)图像分割工具的完整实现,结合Tkinter界面设计及Python代码示
开发语言·python·图论
flashlight_hi2 小时前
LeetCode 分类刷题:2529. 正整数和负整数的最大计数
python·算法·leetcode
Ashlee_code2 小时前
香港券商櫃台系統跨境金融研究
java·python·科技·金融·架构·系统架构·区块链
Jia-Hui Su3 小时前
GDSFactory环境配置(PyCharm+Git+KLayout)
git·python·pycharm
学习3人组4 小时前
手写数字识别代码
人工智能·python
毅航4 小时前
从原理到实践,讲透 MyBatis 内部池化思想的核心逻辑
后端·面试·mybatis
展信佳_daydayup4 小时前
02 基础篇-OpenHarmony 的编译工具
后端·面试·编译器
Always_Passion4 小时前
二、开发一个简单的MCP Server
后端
用户721522078774 小时前
基于LD_PRELOAD的命令行参数安全混淆技术
后端