Flask-JWT-Extended登录验证

news/2024/9/18 21:16:53 标签: flask, python, 后端

1. 介绍 

"""
    安装:
        pip install Flask-JWT-Extended

    创建对象 初始化与app绑定
        jwt = JWTManager(app)  # 初始化JWTManager

    设置 Cookie 的选项:
        除了设置 cookie 的名称和值之外,你还可以指定其他的选项,例如:
            过期时间 (max_age):   指定 cookie 何时过期。
             # max_age=60 * 60 * 24 * 7  # 7天有效期
            max_age=datetime.timedelta(days=2)


    1. 设置cookies
             # 设置cookies成功 重定向到首页
            # 创建JWT token,只存储用户名
            access_token = create_access_token(identity=username)

            # 设置JWT到cookie并重定向到主页
            response = redirect(url_for('index'))

            set_access_cookies(
                response, access_token,
                # max_age=60 * 60 * 24 * 7  # 7天有效期
                max_age=datetime.timedelta(days=2)
            )
            return response

    2. 获取cookies
            # 获取当前会话中的身份信息
            info = get_jwt_identity()
            return render_template('index.html', info=info)

    3. 设置cookies会话有效期
            max_age=datetime.timedelta(hours=2),  # 设置会话有效期时间
            # max_age=60 * 60 * 24 * 2,

    4. 删除cookies
            # 注销用户并删除JWT cookies
            response = redirect(url_for('login'))
            unset_jwt_cookies(response)
            return response

    5. response
        创建对象的方法:
            导包:
                from flask import make_response, Response
            
                # 1. response = make_response(redirect(url_for('test_blue.login_index')))
                # 2. response = make_response(render_template('test/home.html'), 200)
                # 3. response = make_response("success", 201)
                # 这种就可以
                # 4. response = redirect(url_for('login'))

"""

 

 

 

​​​​​​​ 

2. 验证

''' 验证 '''
'''
# 1. 重新改写这个方法
# def jwt_required(
#         optional: bool = False, fresh: bool = False,
#         refresh: bool = False, locations: Optional[LocationType] = None,
#         verify_type: bool = True, skip_revocation_check: bool = False, ) -> Any:
#     def wrapper(fn):
#         @wraps(fn)
#         def decorator(*args, **kwargs):
#             try:
#                 verify_jwt_in_request(
#                     optional, fresh, refresh, locations, verify_type, skip_revocation_check
#                 )
#                 return current_app.ensure_sync(fn)(*args, **kwargs)
#             except Exception as e:
#                 return redirect(url_for('login'))  # 没有身份信息时重定向到登录页
#
#         return decorator
#
#     return wrapper
#
'''

'''
2. 这种自定义的可以 重定向
# 自定义auth装饰器来检查JWT身份验证
# def auth(fn):
#     @wraps(fn)
#     def inner(*args, **kwargs):
#         try:
#             verify_jwt_in_request()  # 验证请求中是否存在有效的JWT
#             if not get_jwt_identity():  # 检查JWT中是否有身份信息
#                 return redirect(url_for('login'))  # 没有身份信息时重定向到登录页
#         except Exception as e:
#             print(e)
#             return redirect(url_for('login'))  # 捕获所有异常,重定向到登录页
#         return fn(*args, **kwargs)
#
#     return inner
'''

'''
# 3. @jwt_required()
#  直接在函数上装饰验证 只会抛异常 不能自动重定向


# 4. 自定义auth装饰器来检查JWT身份验证
#  这种的验证 只会抛异常 不能自动重定向
# def auth(fn):
#     @wraps(fn)
#     @jwt_required()
#     def inner(*args, **kwargs):
#         if not get_jwt_identity():  # 检查JWT中是否有身份信息
#             return redirect(url_for('login'))  # 没有身份信息时重定向到登录页
#         return fn(*args, **kwargs)
# 
#     return inner
'''

'''
# 5. 在前端直接重定向
$.ajax({
    url: '/protected',
    method: 'GET',
    success: function(data) {
        // 处理成功的响应
    },
    error: function(jqXHR) {
        if (jqXHR.status === 401) {
            window.location.href = '/login';
        }
    }
});

'''

'''
# 6. 设置存储在cookies 不然报错 以下是四种方式   可以都选 单选
app.config['JWT_TOKEN_LOCATION'] = ["cookies"]
# app.config['JWT_TOKEN_LOCATION'] = ["headers", "cookies", "query_string", "json"]

'''

 

 

3. 代码

python">
import datetime
import hashlib

from flask import (
    Flask, render_template, redirect, url_for, request,
    session, make_response, Response, current_app
)
from functools import wraps
from flask_jwt_extended import (
    JWTManager, create_access_token, set_access_cookies,
    get_jwt_identity, unset_jwt_cookies,
    jwt_required,
    verify_jwt_in_request,
)

from typing import Optional, Any
from flask_jwt_extended.view_decorators import LocationType





app = Flask(__name__)
app.secret_key = "ghakjhkghkahkhgkhalkfdngkasnkglhaj".encode('utf-8')

app.config['JWT_TOKEN_LOCATION'] = ["cookies"]

jwt = JWTManager(app)  # 初始化JWTManager


@app.route('/')
@app.route('/index', methods=["GET", "POST"])
# @auth  # 使用auth装饰器
@jwt_required()
def index():
    # 获取当前会话中的身份信息
    info = get_jwt_identity()
    return render_template('index.html', info=info)


@app.route('/login', methods=["GET", "POST"])
def login():
    if request.method == "POST":
        username = request.form.get('username', None)
        password = request.form.get('password', None)
        confirm_password = request.form.get('confirm_password', None)

        # 表单验证逻辑
        if not username or not password or not confirm_password:
            return render_template('login.html', errors="所有字段不能为空")
        if password != confirm_password:
            return render_template('login.html', errors="密码不一致")

        # 假设用户名和密码验证成功
        if username == "root" and password == "123":
            # 创建JWT token,只存储用户名
            access_token = create_access_token(identity=username)
            # 设置JWT到cookie并重定向到主页
            response = redirect(url_for('index'))
            set_access_cookies(
                response, access_token,
                # max_age=60 * 60 * 24 * 7  # 7天有效期
                max_age=datetime.timedelta(days=2)
            )
            return response
        else:
            return render_template('login.html', errors="账号或密码有误")

    return render_template('login.html')


@app.route('/logout', methods=["GET", "POST"])
# @auth
@jwt_required()
def logout():
    # 注销用户并删除JWT cookies
    response = redirect(url_for('login'))
    unset_jwt_cookies(response)
    return response


@app.route('/test')
# @auth
@jwt_required()
def test():
    return "测试成功"


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


http://www.niftyadmin.cn/n/5664538.html

相关文章

2024最新软件测试面试题【1000道题含答案】

1、自动化代码中,用到了哪些设计模式? 单例设计模式 工厂模式PO设计模式数据驱动模式面向接口编程设计模式 2、什么是断言( Assert) ? 断言Assert用于在代码中验证实际结果是不是符合预期结果,如果测试用例执行失败会抛出异常并提供断言日志 3、什么是web自动化…

什么时候分表,什么时候分库?

1.垂直分表(拆字段) 一个表按照字段分为多个表, 可以很好的隔离核心数据和非核心数据 2.垂直分库 “专库专用”, 电商库一开始为商品表,物流表,商家表,订单表 垂直分库后的结果就是 商品库,商家库&#…

【在Linux世界中追寻伟大的One Piece】进程间关系与守护进程

目录 1 -> 进程组 1.1 -> 什么是进程组 1.2 -> 组长进程 2 -> 会话 2.1 -> 什么是会话 2.2 -> 如何创建会话 2.3 -> 会话ID(SID) 3 -> 控制终端 4 -> 作业控制 4.1 -> 什么是作业(job)和作业控制(Job Control) 4.2 -> 作业号 4.3…

离散制造 vs 流程制造:锚定精准制造未来,从装配线到化学反应,实时数据集成在制造业案例中的多维应用

使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量替代 OGG, Kettle 等同步工具,以及基于 Kafka 的 ETL 解决方案,「CDC 流处理 数据集成」组合拳,加速仓内数据流转,帮助企业…

JS_事件的简介和常见事件的绑定_02

表单事件 onfocus 元素获得焦点时触发onblur 元素失去焦点时触发onchange 表单元素的内容改变时触发onsubmit submit时触发onreset reset时触发 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

Python计算机视觉编程 第七章 图像搜索

目录 基于内容的图像检索 (CBIR)视觉单词图像索引建立数据库添加图像 在数据库中搜索图像利用索引获取候选图像确定对比基准并绘制结果 使用几何特性对结果排序建立演示程序及Web应用图像搜索演示程序 基于内容的图像检索 (CBIR) 定义: CBIR是一种技术&#xff0c;通过直接分析…

第十二周:机器学习笔记

第十二周周报 摘要Abstract机器学习1. Recurrent Neural Network&#xff08;下&#xff09;1.1 RNN的Loss Function怎么求&#xff1f;1.2 RNN奇怪的特性1.3 如何解决 RNN 梯度消失或者爆炸1.4 RNN 其他应用 Pytorch学习1. 现有的网络模型使用以及其修改1.1 在VGG16模型添加Mo…

香港科技大学工学院2025/2026年度硕士研究生(MSc)项目招生宣讲会——华南师范大学佛山校区

&#x1f514;香港科技大学工学院2025/2026年度硕士研究生&#xff08;MSc&#xff09;项目招生宣讲会 &#x1f559;时间&#xff1a;2024年9月26日&#xff08;星期四&#xff09;19:00 &#x1f3e0;地点&#xff1a;华南师范大学佛山校区图书馆电影院 &#x1f386;2024T…