flask处理token的装饰器

以下是在 Flask 中基于 token 实现的登录验证装饰器的示例代码:

python 复制代码
import jwt
from functools import wraps
from flask import request, jsonify, current_app

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        token = request.headers.get('Authorization')
        if not token:
            return jsonify({'message': 'Missing token'}), 401

        try:
            data = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
            current_user = data['username']
        except Exception as e:
            return jsonify({'message': 'Invalid token'}), 401

        return f(current_user, *args, **kwargs)

    return decorated_function

该装饰器首先检查请求头中是否存在 Authorization 字段,并解码其中的 token。如果没有找到 token,则返回一个包含错误消息的 JSON 响应。如果找到了 token,则使用 JWT 对其进行解码,同时使用 Flask 的 current_app 对象获取 SECRET_KEY。如果解码成功,那么装饰器会将解码出来的用户名传递给被装饰函数。如果解码失败,则返回一个包含错误消息的 JSON 响应。可以在需要登录验证的视图函数上添加该装饰器,例如:

python 复制代码
@app.route('/protected')
@login_required
def protected(current_user):
    return jsonify({'message': 'This is a protected endpoint for user {}'.format(current_user)})

在上述代码中,protected 视图函数被 @login_required 装饰器进行修饰,当用户成功登录后,该视图函数会返回一个包含当前用户信息的 JSON 响应。需要注意的是,已经登录的用户才能访问该视图函数,否则将返回一个包含错误消息的 JSON 响应。

不过以上内容中涉及了解密参数,如果token并未进行加密可以按照如下方式写:

python 复制代码
from functools import wraps
from flask import request, jsonify
def login_required_token(f):
    @functools.wraps(f)
    def decorated_function(*args, **kwargs):
        token = request.headers.get('Authorization')
        if not token:
            return jsonify({'message': 'Missing token'}), 401

        return f(*args, **kwargs)

    return decorated_function
python 复制代码
@app.route('/logaudit/program/', methods=["POST"])
@login_required_token
def program_log():
    # print("#"*50)
    # print("current user is:",current_user)
    return makeresponse("首页")
   
相关推荐
Ulyanov3 分钟前
Apache Kafka在雷达仿真数据流处理中的应用
分布式·python·kafka·apache·雷达电子战
u0109147608 分钟前
CSS如何处理超长文本换行问题_结合word-wrap属性
jvm·数据库·python
电化学仪器白超12 分钟前
小乌龟Git全程图形化操作指南:嵌入式本地版本管理与Gitee私有云备份实战
git·python·单片机·嵌入式硬件·物联网·gitee·自动化
2401_8371638913 分钟前
如何在 Go 中正确解析带命名空间的 SOAP 响应
jvm·数据库·python
_Evan_Yao13 分钟前
RAG中的“Chunk”艺术:我试过10种切分策略后总结的结论
java·人工智能·后端·python·软件工程
m0_3776182313 分钟前
CSS如何处理溢出隐藏_使用overflow-hidden与盒模型
jvm·数据库·python
今天你TLE了吗19 分钟前
LLM到Agent&RAG——AI概念概述 第二章:提示词
人工智能·笔记·后端·学习
qq_50242899034 分钟前
清华大学与微软亚洲研究院出品:Kronos 本地部署教程
数据结构·python·金融量化·kronos开源模型
2301_8148098639 分钟前
CSS Grid布局如何解决图片溢出网格单元_设置object-fit与网格尺寸.txt
jvm·数据库·python
m0_678485451 小时前
如何在Bootstrap中自定义Modal的弹出动画效果
jvm·数据库·python