FastAPI 学习之路(五十七)校验是否登陆

news2024/11/15 5:58:18

      在之前的分享的中,产生了token,用于做登录的认证,那么产生了token后,登陆携带了token,我们如何校验呢?

先来梳理下逻辑:

1. 调用登录接口,产生token

2.调用依赖登录的接口,在请求头中携带token

3.依赖登录的接口,接收到请求,判断是否在headers中携带token

4.携带token,校验是否过期

5.解析token,获取username

6.根据username从redis获取

7.查询到username的token且token相等,我们认为用户登录

8.调用接口返回数据

9.如果其中一项校验不通过,返回对应的失败信息

思路梳理完毕,下面我们把逻辑实现

        先从headers中获取token并且验证是否在redis中存在这个token

async def get_current_user(request: Request, token: Optional[str] = Header(...)) -> BaseUser:
    """token依赖请求头的token校验"""
    # 验证失败返回信息
    credentials_exc = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Authentication Failed",
        headers={"WWW-Authenticate": "Bearer"}
    )
    # 未登录返回信息
    not_login_exc = HTTPException(
        status_code=status.HTTP_403_FORBIDDEN,
        detail="NOT LOGIN OR TOKEN EXPIRED"
    )
    try:
        # 解析token
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        username = payload.get("sub")
        if username is None:
            raise credentials_exc
        # 从redis获取用户token
        redis_token = await request.app.state.redis.get(username)
        if not redis_token or redis_token != token:
            raise not_login_exc
        return BaseUser(email=username)
    except JWTError:
        raise credentials_exc

BaseUser类如下,放在了schemas中

class BaseUser(BaseModel):
    email: str

        接下来,我们修改下之前获取用户信息接口,需要依赖登录,返回当前用户信息

@user_router.get("/user", response_model=UserOut)
def get_user(user: BaseUser = Depends(get_current_user),
             db: Session = Depends(create_db)):
    return get_user_by_email(db, user.email)

测试,看下效果

①:不携带token

 ②:携带token(如果没有token值,先调用登录接口)

③:使用错误token

 我们发现,当携带token后返回了当前的用户信息。这样我们就简单的把用户登录认证实现了

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

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

相关文章

1.CATIA:CAA调用Excel接口

生成调用Excel的头文件 参考如下进行excel头文件的生成: 如何使用vs2022通过excel.exe生成VC、C++能够使用的头文件 添加如下的接口: #include "CApplication.h" #include "CWorkbook.h" #include "CWorkbooks.h" #include "CWorkshee…

Linux——文件目录指令、时间日期指令、搜索查找指令、压缩解压指令

目录 文件目录指令 pwd & ls 查看当前工作目录&显示当前目录所有文件及目录 cd 切换目录 mkdir & rmdir 创建&删除目录 touch 创建空文件 cp 拷贝文件/文件夹指令 rm 删除文件或文件夹 mv 移动或重命名文件 cat 查看文件 more指令 less 查看文件内容…

驱动LSM6DS3TR-C实现高效运动检测与数据采集(8)----中断获取FIFO数据并应用MotionFX库解析空间坐标

驱动LSM6DS3TR-C实现高效运动检测与数据采集.8--中断获取FIFO数据并应用MotionFX库解析空间坐标 概述视频教学样品申请源码下载开启LED开启INT中断参考驱动程序中断读取传感器数据主程序演示 概述 本文将探讨如何使用中断机制获取FIFO数据并应用MotionFX库解析空间坐标。Motio…

CIS光生电荷

文章目录 CIS基础光电效应光的吸收最大光敏度的计算 CIS基础 CIS光信号转电信号:CIS图像传感器主要用来把直接发射或物体反射的光子组成的图像转换成电信号。在积分时间内,图像传感器吸收光子并记录电信号,确定积分时间内每一个像素接收到的…

昇思25天学习打卡营第15天|munger85

K近邻算法实现红酒聚类 现在数据集这个就是红酒的分类的数据集红酒每一个都会有很多的属性有三个属性下载数据集,这个是红酒的分类的数据集,红酒每一个都会有很多的属性,有三个属性。这十三个属性就可以用来分辨它是哪一个13个属性就可以用来…

【机器学习】Grid Search: 一种系统性的超参数优化方法

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 Grid Search: 一种系统性的超参数优化方法引言什么是Grid Search?Gr…

【机器学习】机器学习与图像分类的融合应用与性能优化新探索

文章目录 引言第一章:机器学习在图像分类中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 数据增强 1.2 模型选择1.2.1 卷积神经网络1.2.2 迁移学习1.2.3 混合模型 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 Adam优化器 1.4 模型评估与性能优…

超高性价比降压型DC-DC / YB2419 电源解决方案行业多领域适用

一上车,手机电量告急,这可是出行的大忌! 别急,要知道,在这个快节奏的时代,时间就是金钱,谁也不想在充电这件事上浪费时间。这个时候需要车载充电器来拯救你的电池焦虑症! 还能智能匹配不同手机品牌&#xf…

gltf模型加载 与3d背景贴图

Poly Haveny 用于3d模型跟贴图下载资源 Sketchfab 里面有免费的模型 模型放到public里面 const loader new GLTFLoader()// 加载GLTF模型loader.load(/scene.gltf,(gltf) > {// 将加载的模型添加到场景中scene.add(gltf.scene)// 现在你可以开始渲染循环了let angle …

基于Java的疫情防控期间某村外出务工人员信息管理系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:Java MySQL 工具:Eclipse、MySQL环境配置工具 系统展示 首页 用户管理界面 行程分析…

学懂C语言(四):C语言数据类型

目录 一、数据类型分类 二、存储大小和值范围 三、类型转换 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。 一、数据类型分类 C 中的类型可分为以下几…

记录些MySQL题集(7)

1. 什么是SQL? SQL 的全称是 Structured Query Language,即结构化查询语言,它是用来与关系型数据库管理系统(RDBMS)交互的语言,包括从表中获取、更新、插入和删除数据,也就是我们常说的增删改查…

11 网络编程、反射

文章目录 网络编程1、网络的相关概念2、InetAddress 类3、Socket4、TCP 网络通信编程5、UDP 网络通信编程 反射1、反射机制2、Class 类3、类加载4、通过反射获取类的结构信息5、通过反射创建对象6、通过反射访问类中的成员 网络编程 1、网络的相关概念 网络通信 网络 ip 地…

Qt-事件与信号

事件和信号的区别在于,事件通常是由窗口系统或应用程序产生的,信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装,如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…

vue、js截取视频任意一帧图片

html有本地上传替换部分&#xff0c;可以不看 原理&#xff1a;通过video标签对视频进行加载&#xff0c;随后使用canvas对截取的视频帧生成需要的图片 <template> <el-row :gutter"18" class"preview-video"><h4>视频预览<span&…

灵雀云AML:赋能金融AI,构建数智时代核心竞争力

在人工智能&#xff08;AI&#xff09;技术的迅猛发展中&#xff0c;金融行业正迈入变革的新时代。AI不仅在优化投资决策、信用评估、实时监控和欺诈识别方面展现出强大功能&#xff0c;还极大地提升了客户体验、降低了运营成本&#xff0c;并推动了产品创新。面对智能时代的挑…

基于ssh的链接异常解决方法

VSCode、PyCharm链接异常 一.可能的原因 1.如果实例的系统盘重置或更换镜像&#xff0c;那么SSH的指纹会发生变化&#xff0c;于是SSH时会报错REMOTE HOST IDENTIFICATION HAS CHANGED 2.如果本地ssh config文件权限不对&#xff0c;会由于ssh时无法写入配置报错&#xff08;…

【域名强开】利用百度域名进行强开无视QQ微信拦截漏洞分析

前言 晓杰以前做绿标短网址研究过相关的防洪技术,如今将一一公布相关技术源码,对你有用的话欢迎关注我! - 该文章请订阅后查看,订阅后下拉最后查看 - 该文章请订阅后查看,订阅后下拉最后查看 - 该文章请订阅后查看,订阅后下拉最后查看 - 该文章请订阅后查看,订阅后…

docker部署canal 并监听mysql

1.部署mysql 需要开启mysql的binlong&#xff0c;和创建好用户等 可以参考这个 Docker部署Mysql数据库详解-CSDN博客 2.部署canal 参考这一篇&#xff1a; docker安装Canal&#xff0c;开启MySQL binlog &#xff0c;连接Java&#xff0c;监控MySQL变化_docker canal-CSD…

[Cesium for Supermap] 加载3dTiles,点击获取属性

代码&#xff1a; // 设为椭球var obj [6378137.0, 6378137.0, 6356752.3142451793];Cesium.Ellipsoid.WGS84 Object.freeze(new Cesium.Ellipsoid(obj[0], obj[1], obj[2]));var viewer new Cesium.Viewer(cesiumContainer);var scene viewer.scenescene.lightSource.ambi…