网站首页 > 博客文章 正文
在实际Web应用开发中,JSON Web Tokens (JWT) 作为一种轻量级的身份验证和授权机制被广泛应用。本篇文章将指导大家如何在使用Python Flask框架时结合Flask-JWT-Extended库来实现JWT的认证和授权流程,并通过具体代码示例深入理解其实现原理。
环境配置与依赖安装
首先确保已经安装了Flask及其相关扩展:
pip install flask flask-jwt-extended
初始化Flask应用及配置JWT扩展
from flask import Flask
from flask_jwt_extended import JWTManager
app = Flask(__name__)
jwt = JWTManager(app)
# 在配置字典中设置密钥和其他选项
app.config['JWT_SECRET_KEY'] = 'your-secret-key-here' # 需要替换为实际的密钥
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = 3600 # 设置Access Token过期时间(单位:秒)
jwt.init_app(app)
用户认证模型与注册登录接口
假设有一个简单的User模型和对应的数据库操作,我们需要创建登录接口生成JWT令牌:
from flask_jwt_extended import create_access_token
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username')
password = request.json.get('password')
# 模拟从数据库验证用户名和密码
user = validate_user_credentials(username, password)
if user is not None:
# 成功验证后,生成JWT Access Token
access_token = create_access_token(identity=user.id)
return {'access_token': access_token}, 200
else:
return {'error': 'Invalid credentials'}, 401
def validate_user_credentials(username, password):
# 实际情况下,此函数应该查询数据库并验证用户凭据
# 这里仅做模拟,若匹配则返回用户ID
if username == 'test' and password == 'test_password':
return 1
return None
保护API资源并实现权限控制
接下来,我们将使用@jwt_required()装饰器保护特定API资源,只有携带有效JWT令牌的请求才能访问:
from flask_jwt_extended import jwt_required, get_jwt_identity
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
current_user_id = get_jwt_identity() # 获取JWT中存储的用户ID
return f"Hello, User with ID: {current_user_id}!"
# 示例:更复杂的权限控制
from flask_jwt_extended import fresh_jwt_required, jwt_required, get_jwt_claims
@app.route('/admin-only', methods=['GET'])
@fresh_jwt_required(groups=['admin']) # 只允许具有'admin'角色的用户访问
def admin_only():
claims = get_jwt_claims() # 获取JWT中的自定义声明
return f"Welcome, Admin with roles: {claims['roles']}!"
自定义JWT Claims与角色验证
为了实现更细粒度的权限控制,我们可以向JWT中添加自定义声明:
from flask_jwt_extended import create_access_token, set_access_cookies, unset_jwt_cookies
def create_jwt_for_user(user_id, roles):
payload = {'identity': user_id, 'roles': roles}
token = create_access_token(identity=payload)
return token
# 注册时或者登录时,根据用户的角色生成JWT
token = create_jwt_for_user(user_id=1, roles=['user', 'admin'])
# 当前只展示了如何生成带有自定义声明的JWT,实际上应将其返回给客户端保存
通过以上步骤,我们成功地在Flask应用中实现了基于JWT的用户认证与授权机制。Flask-JWT-Extended库不仅简化了令牌的生成和验证过程,还提供了多种实用的功能如刷新令牌、黑listing令牌等,从而帮助我们在Python Web应用中实现安全可靠的用户身份管理。
关注我,手把手带你快速入门Python Web编程!
猜你喜欢
- 2024-09-10 BI工具superset管理端的单点登录集成
- 2024-09-10 深圳社会志愿者服务管理平台的设计与实现技术方案
- 2024-09-10 web鉴权access_token、AK/SK、session/cookie
- 2024-09-10 如何用Python和Google“自动化”我的婚礼?
- 2024-09-10 Celery与Django:打造高效DevOps的定时任务与异步处理神器
- 2024-09-10 Python面试者必看!245道经典Python面试题及答案解析,可下载
- 2024-09-10 Python如何实现用户鉴权(python用户认证)
- 2024-09-10 traefik hub配置与使用(traefik 设置客户端ip)
- 2024-09-10 Python 潮流周刊#67:uv 的重磅更新(摘要)
- 2024-09-10 聊一聊我认识的Python安全(python的安全性)
你 发表评论:
欢迎- 06-23MySQL合集-mysql5.7及mysql8的一些特性
- 06-23MySQL CREATE TABLE 简单设计模板交流
- 06-23MYSQL表设计规范(mysql设计表注意事项)
- 06-23MySQL数据库入门(四)数据类型简介
- 06-23数据丢失?别慌!MySQL备份恢复攻略
- 06-23MySQL设计规范(mysql 设计)
- 06-23MySQL数据实时增量同步到Elasticsearch
- 06-23MySQL 避坑指南之隐式数据类型转换
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)