python 使用flask_httpauth和pyjwt实现登录权限控制

news2024/11/22 15:35:39

最近需要用到,学习了一下记录

首先安装依赖

pip install Flask-HTTPAuth pyjwt passlib

Welcome to Flask-HTTPAuth’s documentation! — Flask-HTTPAuth documentation 

Welcome to PyJWT — PyJWT 2.8.0 documentation

Passlib 1.7.4 documentation — Passlib v1.7.4 Documentation

 实现验证token的方法,

from dependency_injector.wiring import inject, Provide
from flask_httpauth import HTTPTokenAuth 
import jwt
from flask import current_app

auth_provider = HTTPTokenAuth(scheme='Bearer')

@auth_provider.verify_token
def verify_token(token):  
    try:  
            payload = jwt.decode(token, self.secret_key, algorithms=[self.algorithm])  
            username=payload['username']
            try:
               user = self.user_repository.get_by_name(username)
            except EntityNotFoundError:
                current_app.logger.error(f'====== Login user not found, name : "+{username} ======')
                return False  
            else:
                return user
        except jwt.exceptions.DecodeError as e:  
            current_app.logger.error('====== Decode JWT Failed ======')
            return False  
        except jwt.exceptions.ExpiredSignatureError:  
            current_app.logger.error('====== JWT Already Expired ======')
            return False  

这样的话,只需要引入之前定义的auth_provider,然后在需要登录之后才能访问的api上加入@auth_provider.login_required,当然auth_provider这个变量名是自己取的,你怎么定义的就用什么就行了。这样的话访问该api的时候就会自动去拿jwt验证。

访问的时候需要在headers放Authorization为key,然后Bearer+token为value,Bearer这个指定是在定义auth_provider = HTTPTokenAuth(scheme='Bearer')指定的。

登录的方法可以看到,验证密码之后就会生成jwt返回 ,前端接到这个jwt之后,就会放在之后的请求内

from flask import  Blueprint, jsonify, request,current_app
from dependency_injector.wiring import inject, Provide
from main.containers import Container
from main.security.jwt_filter import auth_provider
import datetime
from passlib.apps import custom_app_context as pwd_context

auth_bp=Blueprint('auth',__name__)

@auth_bp.route('/login', methods=['POST'])
def login():
    data = request.get_json()  
    username = data.get('username', None)  
    password = data.get('password', None)  
    if not username or not password:  
        current_app.logger.error(f'Login failed with missing username or password')
        return jsonify({'error': 'Missing username or password'}), 400  
    try:
       user=self.user_repository.get_by_name(username,session)
    except EntityNotFoundError:
       current_app.logger.error(f'====== Login user not found, name : "+{username} ======')
       return jsonify({'error': 'User does not exist'}), 401     
    if pwd_context.verify(password, user.password):  
           jwt = self._generate_token(user.user_id, username)
           return jsonify({'token': jwt}), 200  
    else:  
           current_app.logger.error(f'{username} login failed.')
           return jsonify({'error': 'Username and password does not match'}), 401   

@auth_bp.route('/account', methods=['GET'])
@auth_provider.login_required
def account():
    return auth_provider.current_user().to_response(),200


def _generate_token(self, user_id, username)->any:
        expire_time = datetime.datetime.now(datetime.UTC) + datetime.timedelta(minutes=self.access_token_expire_minutes)  
          
        payload = {  
            'exp': expire_time,  #失效时间
            'iat': datetime.datetime.now(datetime.UTC),  #生效时间
            'sub': user_id,   
            'username': username 
        }  
        token = jwt.encode(payload, 'A05qYNxO/ka9lzjtB5WVJ6li/KHM91fMMT+4Wm6xRBKMivll2kMmR+cJWyEE0bh4PcwI/9LUwwlzZ0pjkFepTg==', algorithm='HS256')  
        return token  

jwt过期时间你可以根据需求自己定义

 生成密码的方式在这里

from passlib.apps import custom_app_context as pwd_context

TEST_USERS_ARRAY= [
    {
        "id": uuid.uuid1().hex,
        "username":"admin",
        "password": pwd_context.encrypt("admin")
    },
    {
        "id": uuid.uuid1().hex,
        "username":"user1",
        "password": pwd_context.encrypt("user1")
    }
]
from flask import jsonify
from sqlalchemy import Column, String

from main.db_access.domain.common_entity import CommonEntity



class User(CommonEntity):
    __tablename__ = "TBL_AA_USER"

    user_id = Column(String, primary_key=True)
    username = Column(String)
    password = Column(String)
    
    def __init__(self,user_id,username,password):
        self.user_id=user_id
        self.username=username
        self.password=password

    def to_dict(self):
        return {'user_id':self.user_id,'username':self.username}
    
    def to_response(self):  
        data = self.to_dict()  
        response = jsonify(data)  
        response.headers['Content-Type'] = 'application/json'  
        return response

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1627382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【代码随想录刷题记录】LeetCode27移除元素

题目地址 1. 思路 1.1 基本思路及代码的初步实现 基本思路大体上和卡尔老师的想法是一致的,详见代码随想录:数组:移除元素,暴力法大家都能想到,我这里写一下算法时间复杂度为 O ( n ) O(n) O(n)时候的思路&#xff…

短视频矩阵营销系统 poihuoqu 任意文件读取漏洞复现

0x01 产品简介 短视频矩阵营销系统是由北京华益云数据科技有限公司开发的一款产品,这家公司专注于抖音短视频矩阵营销系统的研发,致力于为企业提供全方位的短视频营销解决方案。华益云抖销短视频矩阵系统可以帮助企业快速搭建多个短视频账号,实现内容的批量制作和发布,提高…

ShardingSphere 5.x 系列【25】 数据分片原理之 SQL 解析

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 分片执行流程1.1 Simple Push Down1.2 SQL Federation2. SQL 解析2.1 解析…

SystemUI KeyButtonView setDarkIntensity 解析

继承自 ImageView KeyButtonDrawable intensity为0时按键颜色为白色。 intensity为1时黑色为的调用堆栈: java.lang.NullPointerException: Attempt to invoke virtual method int java.lang.String.length() on a null object referenceat com.android.systemui.…

嵌入式学习Day18

一、输入两个数,实现排序 代码: #!/bin/bashread -p "please enter n m:" n m if [ $n -gt $m ] thentemp$nn$mm$temp fi echo $n $m运行结果 二、输入一个数判断是否水仙花数 代码: echo narcissistic number read -p "p…

店匠科技技术产品闪耀,引领新质生产力发展

在科技飞速发展的今天,新质生产力正成为推动社会进步和经济高质量发展的核心力量。店匠科技,作为一家致力于为全球B2C电商提供产品和技术解决方案的领先企业,其技术产品不仅体现了新质生产力的创新特质,更在推动电商行业转型升级中发挥了重要作用。 新质生产力,以创新为主导,摆…

Java设计模式 _创建型模式_原型模式(Cloneable)

一、原型模式 1、原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能比较好。一般对付出较大代价获取到的实体对象进行克隆操作,可以提升性能。 2、实现思路: (1)、需要克隆的…

macOS 一些系统图标的存放位置 icns

macOS 一些系统图标的存放位置 icns macOS 中有很多好看的图标,有时候就想用一下它,我来告诉你他们的具体位置。 系统图标位置,像各种通用文件类型的图标都在这里面,里面好多高清的系统图标 /System/Library/CoreServices/Core…

济宁市中考报名照片要求及手机拍照采集证件照方法

随着中考报名季的到来,并且进入了中考报名演练阶段,济宁市的广大考生和家长都开始忙碌起来。报名过程中,上传一张符合要求的证件照是必不可少的环节。本文将详细介绍济宁市中考报名照片的具体要求,并提供一些实用的手机拍照采集证…

flutter开发实战-build apk名称及指令abiFilters常用gradle设置

flutter开发实战-build apk名称及指令abiFilters常用gradle设置 最近通过打包flutter build apk lib/main.dart --release,发现apk命名规则需要在build.gradle设置。这里记录一下。 一、apk命名规则 在android/app/build.gradle中需要设置 android.applicationVa…

TinyML之Hello world----基于Arduino Nano 33 BLE Sense Rev2的呼吸灯

早期版本的Hello World 这应该是一个逼格比较高的呼吸灯了,用ML来实现呼吸灯功能,之前已经有大佬发过类似的文章:https://blog.csdn.net/weixin_45116099/article/details/126310816 当前版本的Hello World 这是一个ML的入门例程&#xff…

vue3【详解】vue3 比 vue2 升级了哪些重要的功能?

改用 createApp 初始化实例 vue2 使用 new Vue() 初始化实例 vue3 使用 Vue.createApp() 初始化实例 新增 emits 选项 vue3 选项式API中新增了emits 选项,用于显示声明组件中的自定义事件,自定义事件的名称,需用 on 开头。 export default {…

arcgis js 4.x加载SceneLayer并实现基于属性查询定位及高亮

一、代码 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1,maximum-scale1,user-scalableno"><title></title><link rel…

表情识别 | LBP+SVM实现脸部动态特征的人脸表情识别程序(Matlab)

表情识别 | LBPSVM实现脸部动态特征的人脸表情识别程序&#xff08;Matlab&#xff09; 目录 表情识别 | LBPSVM实现脸部动态特征的人脸表情识别程序&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1 运行环境 程序运行在Windows系统下&am…

PyQt5中QTablewidget生成右键菜单

QTablewidget生成右键菜单&#xff0c;需要自定义一个QTablewidget类 import sys from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QMenu, QAction, QDialog from PyQt5.QtCore import Qt from PyQt5 import QtCoreclass CustomTableWidget(QTabl…

数字文旅重塑旅游发展新格局:以数字化转型为突破口,提升旅游服务的智能化水平,为游客带来全新的旅游体验

随着信息技术的迅猛发展&#xff0c;数字化已成为推动各行各业创新发展的重要力量。在旅游业领域&#xff0c;数字文旅的兴起正以其强大的驱动力&#xff0c;重塑旅游发展的新格局。数字文旅以数字化转型为突破口&#xff0c;通过提升旅游服务的智能化水平&#xff0c;为游客带…

AIGC:开启内容创作新纪元,我们如何看待它的影响与前景?

AIGC的概念 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;的概念主要是指人工智能生成内容。 这是一种新的人工智能技术&#xff0c;它利用人工智能模型&#xff0c;根据给定的主题、关键词、格式、风格等条件&#xff0c;自动生成各种类型的文本、图…

目标检测与追踪AI算法模型及边缘计算智能分析网关V4的算法应用

目标检测与追踪是计算机视觉领域中的一个重要任务&#xff0c;主要用于识别图像或视频中的目标&#xff0c;并跟踪它们的运动轨迹。针对这一任务&#xff0c;有许多先进的AI算法模型&#xff0c;例如&#xff1a; YOLO&#xff08;You Only Look Once&#xff09;&#xff1a;…

SpringCloudAlibaba:2.1nacos

概述 概述 简介 Nacos是阿里巴巴开源的服务注册中心以及配置中心 Nacos注册中心Eureka 服务配置Config 服务总线Bus 官网 Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 名字由来 Naming&#xff1a;名字 Configurations&#xff1a;配置 Service&#xff1a;服务 功能…

使用Keil移植工程时修改单片机型号参数

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 当使用Keil对STM32系列单片机开发时&#xff0c;如果使用的是库函数&#xff0c;那么不同型号单片机的工程项目文件是可以直接移植的。只需要按照下面的步骤修改对应的芯片&#xff0c;就可以直接将工程移植过去&a…