首页 > 编程语言 >python-jose 实现fastapi登录验证

python-jose 实现fastapi登录验证

时间:2024-08-23 09:39:18浏览次数:8  
标签:jose python fastapi db access token Session user import

JWT 和 Session 的区别:

JWT:JWT是一种无状态的认证机制。由于JWT令牌包含了用户的身份信息以及相关的元数据,服务端不需要存储任何用户状态信息,只需要验证JWT令牌的真实性和有效性即可。这使得JWT非常适合于构建无状态的分布式系统,因为JWT令牌可以在不同的服务之间轻松共享。

Session:Session则是一种有状态的认证机制。服务端需要存储用户的认证状态信息,如Session对象,以便在后续的请求中通过Session ID来识别用户身份和权限。这种机制在单一服务的架构中较为常见,但在分布式系统中需要实现多机数据共享,以确保Session信息的一致性和可用性。

目前前后端分离用JWT比较多,这篇文章介绍的是fastapi框架中的登录验证实现。 

 

1、生成 token

直接上代码,token 通过exp参数设置过期时长,选择 HS256、RS256等加密算法。 

from datetime import datetime,timedelta
from jose import jwt
from typing import Optional
import logging,os

# 加密秘钥
SECRET_KEY = os.getenv('SECRET_KEY')
hours = os.getenv('hours')

def creat_access_token(user_id: str,
                       username:str,
                       hour:Optional[int] = int(hours))->str:
    # 设置过期时间
    expire = datetime.utcnow()+timedelta(hours=hour)
    # exp 必传参数
    to_encode = {"exp":expire,"user_id":user_id,"username":username}
    # 生成token,algorithm使用 HS256 加密算法
    access_token = jwt.encode(to_encode,SECRET_KEY,algorithm = 'HS256')

    return access_token

 

2、验证token

  这里用到了Headers,在FastAPI中,Headers是一个特殊的类型,用于处理HTTP请求头(Headers)。Headers允许你接收、访问和修改HTTP请求中的头部信息。token:str=Header(...) 括号里 ... 表示在header里 token 是必传字段。提取到token后,使用jwt.decode()方法解析验证。

from jose.exceptions import ExpiredSignatureError,JWTError,JWSError,JWKError
from jose import jwt
from fastapi import Header

# 签名秘钥
SECRET_KEY = os.getenv('SECRET_KEY')

def check_access_token(token:str=Header(...)):
    try:
        payload = jwt.decode(token,SECRET_KEY,algorithms = ['HS256'])
        print('token验证成功!')
        return payload

    except ExpiredSignatureError:
        print('token过期')

    except JWTError:
        print('token验证失败')

 

在fastapi中实现JWT认证登录。步骤1和2的加密、解密了解清楚了,接下来就比较简单了。先把上面creat_access_token、check_access_token封装到一个security.py文件,然后在业务端引用。

3、API中实现生成token

from fastapi import APIRouter,Depends
from models.cms.user import User
from sqlalchemy.orm import Session
from schemas.cms.user import login
import logging
from plugin.pulgin_sqlalchamy import db
from libs.security import creat_access_token

log = logging.getLogger('uvicorn')

user = APIRouter()

def get_db():
    try:
        yield db
    finally:
        db.close()

@user.post('/login')
async def login(data: login, db: Session =Depends(get_db)):
    user = db.query(User).filter_by(username = data.username,password = data.password).first()
    # 若存在账号密码,创建token
    if user:
        user_id = user.id
        token = creat_access_token(user_id, data.username)
        return token
    else:
        return '账号密码不正确'

 

4、API中验证token

  验证token,用到了Depends 。Depends 是一个非常重要的特性,它允许你以依赖注入的方式向你的路径操作函数(path operation functions)中传递依赖项。这种方式让你的代码更加模块化,更加易于管理和测试。使用 Depends,你可以将复杂的逻辑(如认证、验证、数据库连接等)封装到独立的函数中,然后在需要时通过 Depends 注入到路径操作函数中。这一步使用 Depends 来验证 headers中的 token,在上面 security.py 文件中有定义获取headers中的token参数。

from fastapi import APIRouter,Depends
from models.cms.user import User
from sqlalchemy.orm import Session
from schemas.cms.user import login
import logging
from plugin.pulgin_sqlalchamy import db
from libs.security import creat_access_token,check_access_token

@user.post('/dev')
async def dev(data:dict,access_token:str=Depends(check_access_token) ,db: Session = Depends(get_db)):
    user = db.query(User).filter_by(username = data['username'],password = data['password']).first()
    
    return user

 

标签:jose,python,fastapi,db,access,token,Session,user,import
From: https://www.cnblogs.com/shenh/p/18361502

相关文章

  • Python正则表达式提取车牌号
    在Python中使用正则表达式(RegularExpressions)来提取车牌号是一个常见的任务,尤其是在处理车辆信息或进行图像识别后的文本处理时。中国的车牌号格式多种多样,但通常包含省份简称、英文字母和数字。以下是一个使用Python正则表达式来提取常见中国车牌号(包括新能源车牌)的示例代码。1......
  • 基于 Python 3.12.4 和 PySide 6 的 假用户操作系统【0-0】虚拟终端框架
    基本目标实现工作目录的切换;实现非退出命令下的无限循环;到目前为止还不能实现的功能动态导入py文件中的模块缺少组件定义虚拟进程类command.pyfromctypesimportwindllfromPySide6.QtWidgetsimportQWidgetfromsysimportexitassys_exitfromosimportpath......
  • python怎么用正则表达式筛选网页内容
    一、正则表达式简述:什么是正则表达式?正则表达式就是可以匹配文本片段的模式,最简单的正则表达式就是一个字符串,用于在文本中匹配到此字符串自身。二、常用正则表达式:设计正则表达式的时候有几个注意点如下:a.特殊符号需要加转移符:如要匹配'china.com',则正则表达式格式应为'......
  • python中%s是什么
    python的%s是用作print的格式化输出:打印字符串。Python中内置的%操作符可用于格式化字符串操作,控制字符串的呈现格式,s代表字符串。格式符为真实值预留位置,并控制显示的格式。格式符可以包含有一个类型码,用以控制显示的类型。python中不同类型的字符拥有不同的格式符,分别为......
  • python 05-标准库:csv、json、sqlite3、datetime模块
    csv模块importcsv#data.csv不存在时,会现在当前目录下创建一个data.csv文件withopen("data.csv","w",encoding='utf-8')asfile:writer=csv.writer(file)writer.writerow(["trasanction_id","product_id","pric......
  • Selenium + Python 自动化测试22(PO+数据驱动)
            我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。上一篇我们讨论了PO模式和unittest框架结合起来使用。        本篇文章我们综合一下之前学习的内容,如先将PO模式、数据驱动思想和我们生成HTML报告融合起来,综合的灵活的使用......
  • 第四章 Python操作redis(操作案例)
    一、python对redis基本操作(1)连接redis#方式1importredisr=redis.Redis(host='127.0.0.1',port=6379)r.set('foo','Bar')print(r.get('foo'))#方式2importredispool=redis.ConnectionPool(host='127.0.0.1',po......
  • Python 基础:编程概念
    在黑客和网络安全领域,这通常意味着BASH和Python脚本。Python脚本在网络安全专业人士中最受欢迎,因为它拥有丰富的库和模块,可用于网络安全(你可以使用任何编程语言进行网络安全,但如果有人已经用Python等语言编写了轮子,那么你的生活就会轻松得多)。如果你检查Kali中的工具,你会......
  • python——concurrent.futures
    concurrent.futures是Python标准库中用于并行编程的高级模块,它提供了一种高级别的接口来管理线程和进程。通过这个模块,你可以轻松地利用多线程和多进程来并行执行任务,进而提高程序的执行效率。1.concurrent.futures概述concurrent.futures提供了两种执行器类型:Thre......
  • 【精选】基于Python的热门旅游景点数据分析系统的设计与实现(南京旅游,北京旅游,旅游网站
    目录: 系统简介:  关键技术介绍2.1PYTHON语言简介2.2MySql数据库2.3DJANGO框架2.4Hadoop介绍2.5Scrapy介绍2.6B/S架构 系统总功能结构设计系统详细实现:6系统测试系统测试的目的软件测试过程测试用例为什么选择我: 博主介绍:  ✌我是阿龙,一名......