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

ops/2024/9/25 23:25:48/

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

首先安装依赖

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的方法,

python">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之后,就会放在之后的请求内

python">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过期时间你可以根据需求自己定义

 生成密码的方式在这里

python">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")}
]
python">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.ppmy.cn/ops/18563.html

相关文章

设计不外流,保护创意的同时锁住图纸安全!

在设计行业中,图纸和创意文稿的安全至关重要,因为它们体现了企业的创新能力和核心竞争力。华企盾DSC数据防泄密系统提供了一系列功能,可以有效地保护这些珍贵的设计和文档不被外泄。以下是如何利用华企盾DSC系统保障设计图纸安全的关键措施&a…

OpenHarmony语言基础类库【@ohos.util.HashSet (非线性容器HashSet)】

HashSet基于[HashMap]实现。在HashSet中,只对value对象进行处理。 HashSet和[TreeSet]相比,HashSet中的数据无序存放,即存放元素的顺序和取出的顺序不一致,而TreeSet是有序存放。它们集合中的元素都不允许重复,但Hash…

简明了解常规SpringBoot项目结构

一个典型的 Java Spring Boot 项目的结构通常遵循一定的约定,以便于组织代码和资源。 以下是一个基本的项目结构示例,它包含了常见的目录和文件: my-spring-boot-project/ │ ├── src/ │ ├── main/ │ │ ├── java/ │ │…

阿里云企业邮箱API的使用方法?调用限制?

阿里云企业邮箱API性能如何优化?配置邮箱API的优势? 阿里云企业邮箱以其稳定、高效和安全的特点,受到了众多企业的青睐。而阿里云企业邮箱API的开放,更是为企业提供了更加灵活、便捷的管理和操作方式。下面,我AokSend…

【前端技术】CSS基本语法(二)

一、 flex布局 flex布局称之为弹性布局给父元素设置display:flex&#xff0c;子元素可以自动挤压或拉伸内容&#xff0c;主轴方向默认为水平方向&#xff08;从左至右&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"…

快速上手canvas

什么是Canvase Canvas 是 HTML5 中的一个重要特性&#xff0c;它允许你使用 JavaScript 在网页上动态绘制图形。Canvas 通过 JavaScript 来控制&#xff0c;在 HTML 页面中创建一个画布元素 <canvas>&#xff0c;然后使用 JavaScript 中的 Canvas API 来进行绘制。 用法…

PyTorch的基本概念及使用场景

PyTorch是一个用于构建动态计算图的开源机器学习框架。它由Facebook的人工智能研究团队开发&#xff0c;并于2017年发布。PyTorch提供了丰富的工具和库&#xff0c;使用户能够轻松地构建和训练神经网络模型。 PyTorch的核心概念是张量&#xff08;tensor&#xff09;和自动求导…

自然语言处理的发展及归纳介绍

NLP简介 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是人工智能领域的一个重要分支&#xff0c;旨在使计算机理解、解释和生成人类语言。NLP的产生背景可以追溯到上世纪50年代&#xff0c;随着计算机科学和人工智能领域的发展&#xff0c…