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

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

首先安装依赖

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_appauth_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 userexcept 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_contextauth_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(),200def _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_contextTEST_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, Stringfrom main.db_access.domain.common_entity import CommonEntityclass 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_idself.username=usernameself.password=passworddef 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.mzph.cn/web/3921.shtml

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

相关文章

Unreal Engine子类化系统UButton

UE系统Button点击事件无法传递参数,通过子类化系统Button添加自定义参数扩展实现Button点击事件参数传递点击C类文件夹,在右边的区域点击鼠标右键,在弹出的菜单中选择“新建C类”在弹出的菜单中选中“显示所有类”,选择Button作为…

Docker从无到有

主要为windows下docker的安装与使用~ 初始Docker Docker理解 对于docker的加简介,我们可以官网获取它的概念,接下来就从什么是docker、为什么要使用docker以及它的作用来进行一个快速入门 前提:项目在发布时,不仅需要其jar包同…

FSMC读取FPGA的FIFO

一、硬件说明 FSMC配置 单片机的代码如下: #define VALUE_ADDRESS_AD1 (__IO uint16_t *)0x60400000while (1){if(!HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_8)) //数据非空{data *(__IO uint16_t *)VALUE_ADDRESS_AD1;data2 *(__IO uint16_t *)VALUE_ADDRESS_AD1…

英伟达助力日本量子技术创新战略!合作打造量子超级计算机 ABCI-Q

内容来源:量子前哨(ID:Qforepost) 文丨浪味仙 排版丨沛贤 深度好文:1000字丨5分钟阅读 摘要:日本将在英伟达的AI和HPC基础设施的帮助下,通过大规模开发,在量子计算和人工智能领域取…

xfce4 panel 不能显示QQ,钉钉的状态图标

有一段时间不能显示了,之前刚装完系统的时候很长时间内都是好的,所以刚开始肯定是支持显示这些状态图标的。就是因为不能显示的原因,所以还装了lxQt桌面,这个桌面确实不错。不过还是有时会怀念xfce4,想看看能不能解决这…

go语言实现心跳机制样例

目录 1、服务端代码: 2、客户端代码: 3、最终实现效果: 1、服务端代码: package mainimport ("fmt""net" )func handleClient(conn net.Conn) {defer conn.Close()fmt.Println("Client connected:&qu…

怎么用PHP语言实现远程控制电器

怎么用PHP语言实现远程控制电器呢? 本文描述了使用PHP语言调用HTTP接口,实现控制电器,通过控制电器的电源线路来实现电器控制。 可选用产品:可根据实际场景需求,选择对应的规格 序号设备名称厂商1智能WiFi通断器AC3统…

【Redis | 第十篇】Redis与MySQL保证数据一致性(两种解决思路)

文章目录 10.Redis和MySQL如何保证数据一致性10.1双写一致性问题10.2数据高度一致性10.3数据同步允许延时10.3.1中间件通知10.3.2延迟双删 10.Redis和MySQL如何保证数据一致性 10.1双写一致性问题 Redis作为缓存,它是如何与MySQL的数据保持同步的呢?特…

【Docker】Docker 实践(一):在 Docker 中部署第一个应用

Docker 实践(一):在 Docker 中部署第一个应用 1.使用 YUM 方式安装 Docker2.验证 Docker 环境3.在 Docker 中部署第一个应用3.1 小插曲:docker pull 报 missing signature key 错误3.2 重新安装 Nginx 1.使用 YUM 方式安装 Docker…

Stable Diffusion 常用放大算法详解

常用放大算法 图像放大算法大致有两种: 传统图像放大算法(Lantent、Lanczos、Nearest)AI图像放大算法(4x-UltraSharp、BSRGAN、ESRGAN等) 传统图像放大算法是基于插值算法,计算出图像放大后新位置的像素…

不同技术实现鼠标滚动图片的放大缩小

摘要: 最近弄PC端的需求时,要求在layui技术下实现鼠标滚动图片的放大缩小的功能!下面来总结一下不同框架剩下这功能! layui: 看了一下layui文档,其实这有自带的组件的!但是又版本要求的!并且layui的官方文档…

STM32学习和实践笔记(22):PWM的介绍以及在STM32中的实现原理

PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式&#xff…

Ubuntu16.04搭建webrtc服务器

本人查阅无数资料,历时3周搭建成功 一、服务器组成 AppRTC 房间+Web服务器 https://github.com/webrtc/apprtcCollider 信令服务器,在AppRTC源码里CoTurn coturn打洞+中继服务器 Nginx 服务器,用于Web访问代理和Websocket代理。AppRTC 房间+Web服务器使用python+js语言 App…

RFID技术引领3C手机镜头模组产线智能化转型

RFID技术引领3C手机镜头模组产线智能化转型 应用背景 随着智能手机市场的快速发展与技术创新,手机镜头模组作为影像功能的核心组件,其生产精度、效率及供应链管理的重要性日益凸显。面对复杂多变的市场需求、严格的品质要求以及激烈的市场竞争&#xf…

面试集中营—ElasticSearch架构篇

一、为什么用ElasticSearch? 1、支持多种数据类型。它可以处理非结构化、数值和地理信息等多种类型的数据; 2、简单的RESTful API。ES提供了一个简单易用的RESTful API,使得它可以从任何编程语言中调用,降低了学习的曲线。 3、近实…

12G-SDI视频分配器JR104D-4K-SDI

JR104D-4K-SDI 12G-SDI分配器1分4,12G-SDI分配器1分2,12G-SDI分配器1分8,机架式12G-SDI分配器1分4,12G-SDI分配器4组1分4,12G-SDI分配器16组1分4, 广播级指标生产厂家。 一、产品介绍: JR104D-4K-SDI视频分配器,是按…

Pytest用例自定义 - 重复、并行、串行

简介:面对快速迭代和持续交付的需求,提高测试效率变得至关重要。并行测试因其显著的时间节省优势而备受青睐。然而,并非所有测试都适合并行执行。在某些情况下,串行执行是必要的,以确保测试的正确性和稳定性。本文将探…

HarmonyOS 鸿蒙下载三方依赖 ohpm环境搭建

前言 ohpm(One Hundred Percent Mermaid )是一个集成了Mermaid的命令工具,可以用于生成关系图、序列图、等各种图表。我们可以使用ohpm来生成漂亮且可读性强的图表。 本期教大家如何搭建ophm环境: 一、在DevEco Studio中&#…

c++图论基础(2)

目录 图的存储方式: 邻接矩阵: 代码实现: 邻接表: 代码实现: 邻接矩阵邻接表对比: 带权图: 邻接矩阵存储: 邻接表存储(代码实现): 图的存储方式: 邻…

【数据结构】合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 Definition for singly-linked list.struct ListNode {int val;struct ListNode *next;};typedef struct ListNode ListNode; struct ListNode* mergeTwoLists(struct Lis…