FastAPI-Cookie

fastapi-learning-notes/codes/ch01/main.py at master · Relph1119/fastapi-learning-notes · GitHub

1、Cookie的作用

Cookie可以充当用户认证的令牌,使得用户在首次登录后无需每次手动输入用户名和密码,即可访问受限资源,直到Cookie过期或被手动清除。

2、查找Cookie

Google Chrome:

  1. 打开Chrome浏览器。
  2. 右上角点击三个点形成的菜单图标,选择“更多工具” > “开发者工具”(也可以直接按F12或Ctrl+Shift+I快捷键)。
  3. 在开发者工具窗口中,点击顶部的“Application”选项卡。
  4. 在左侧导航栏,展开“Cookies”部分,选择您想查看的网站域名。


 3、Cookie代码

下面这段代码使用FastAPI框架实现了一个简单的用户登录和用Cookie进行用户认证

  • 首先定义了一个User模型类,用于表示用户信息。
  • 创建了一个模拟的用户数据库fake_users_db,其中包含5个用户及其密码。
  • 定义了一个active_tokens字典,用于存储有效的会话令牌及其对应的用户名。
  • get_current_user函数用于验证Cookie中的会话令牌是否有效。如果有效,则返回对应的用户名;否则抛出HTTPException,表示无效的会话令牌。
  • login路由处理函数用于处理用户登录请求。首先验证用户凭据是否正确,如果正确,则生成一个随机的会话令牌,并将其与用户名关联起来,存储在active_tokens中。然后将该令牌设置为Cookie,并返回登录成功的信息以及相关数据。
  • protected_route路由处理函数是一个受保护的路由,只有携带有效会话令牌的请求才能访问。该函数依赖于get_current_user函数来验证用户身份,并返回欢迎信息。

最后,在主函数中使用uvicorn启动FastAPI应用程序。根据不同的模式,可以选择线上模式或调试模式运行

import secrets
import uvicorn
from fastapi import FastAPI, Depends, Cookie, HTTPException, Response
from pydantic import BaseModel

app = FastAPI()


# 用户模型
class User(BaseModel):
    username: str
    password: str


# 模拟的用户数据库,现在包含5个用户
fake_users_db = {
    "john_doe": {"username": "john_doe", "password": "secret_john"},
    "jane_smith": {"username": "jane_smith", "password": "secret_jane"},
    "alice": {"username": "alice", "password": "secret_alice"},
    "bob": {"username": "bob", "password": "secret_bob"},
    "charlie": {"username": "charlie", "password": "secret_charlie"}
}

# 假设这是存储token与其对应用户的简单字典
active_tokens = {}


def get_current_user(session_token: str = Cookie(None)):
    """
    验证Cookie中的session_token是否有效,这里是简化的版本,实际应用中应该有更安全的验证机制。
    """
    user = active_tokens.get(session_token)
    if user is not None:
        return user
    else:
        raise HTTPException(status_code=401, detail="Invalid session token")


@app.post("/login")
async def login(response: Response, user: User):
    if user.username in fake_users_db and user.password == fake_users_db[user.username]["password"]:
        token = secrets.token_hex(16)
        active_tokens[token] = user.username  # 将生成的token与用户名关联起来
        print("active_tokens:", active_tokens)
        response.set_cookie(key="session_token", value=token, max_age=60 * 60 * 24)
        return {"username": user.username,
                "password": user.password,
                "token": token,
                "active_tokens": active_tokens,
                "message": f"Login successful for user {user.username}"}

    else:
        raise HTTPException(status_code=401, detail="Incorrect username or password")


@app.get("/protected-route")
async def protected_route(user: str = Depends(get_current_user)):
    """
    受保护的路由,只有携带有效Cookie的请求才能访问
    """
    return {"message": f"Welcome back, {user}!"}


# 主函数,用于启动FastAPI应用程序
if __name__ == "__main__":
    ## 线上模式
    # uvicorn.run("abr_server:app", host="0.0.0.0", port = 1218)

    ## debug 模式
    uvicorn.run("test5:app", host="0.0.0.0", port=1220, reload=True)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式——责任链

责任链模式是一种行为设计模式,用于将请求的发送者和接收者解耦。在这种模式中,请求通过一条由多个对象组成的链传递,直到有一个对象能够处理该请求为止。每个对象都可以决定是否处理请求以及是否将请求传递给下一个对象。 责任链模式通常在…

数字时代的软件架构:持续架构的兴起与架构师角色的转变

在数字化浪潮的推动下,软件架构领域正经历着前所未有的变革。Eoin Woods在《数字时代的软件架构》演讲中,深入探讨了这一变革,并提出了“持续架构”这一概念。本文将基于Eoin的观点,结合个人理解,探讨持续架构的重要性…

2000-2021年县域金融机构存贷款数据

2000-2021年县域金融机构存贷款数据 1、时间:2000-2021年 2、指标:统计年度、地区编码ID、县域代码、县域名称、所属地级市、所属省份、年末金融机构贷款余额/亿元、年末金融机构存款余额/亿元、年末城乡居民储蓄存款余额/亿元 3、来源:县…

音频Balance源码总结

音频Balance源码总结 何为音频Balance? 顾名思义,Balance及平衡,平衡也就是涉及多方,音频左右甚至四通道,调节所有通道的音量比,使用户在空间内听到各个通道的音频大小不一,好似置身于真实环境…

姚期智、张亚勤、薛澜、Stuart Russell、Max Tegmark,DeepMind研究员等共话全球AI治理丨大会回顾...

为什么AI安全已迫在眉睫?如何构建全球范围内的合作?民众该如何参与到其中?未来的AI系统将是什么样的? 2024年6月15日,智源大会第二天,多位AI安全领域专家进行圆桌讨论,连接中国北京和美国加利福…

Android隐藏状态栏和修改状态栏颜色_亲测有效

本文记录了隐藏状态栏和修改状态栏颜色以及电量、WiFi标志等内容的模式显示,亲测有效。 1、隐藏屏幕状态栏 public void hideStatusBar(BaseActivity activity) {Window window activity.getWindow();//没有这一行无效window.addFlags(WindowManager.LayoutParam…

基于自组织长短期记忆神经网络的时间序列预测(MATLAB)

LSTM是为了解决RNN 的梯度消失问题而诞生的特殊循环神经网络。该网络开发了一种异于普通神经元的节点结构,引入了3 个控制门的概念。该节点称为LSTM 单元。LSTM 神经网络避免了梯度消失的情况,能够记忆更长久的历史信息,更能有效地拟合长期时…

Spring Cloud LoadBalancer基础入门与应用实践

官网地址:https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html 【1】概述 Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用…

[OtterCTF 2018]Recovery

里克必须找回他的文件!用于加密文件的随机密码是什么 恢复他的文件 ,感染的文件 ? vmware-tray.ex 前面导出的3720.dmp 查找一下 搜索主机 strings -e l 3720.dmp | grep “WIN-LO6FAF3DTFE” 主机名 后面跟着一串 代码 aDOBofVYUNVnmp7 是不…

C++并发之环形队列(ring,queue)

目录 1 概述2 实现3 测试4 运行 1 概述 最近研究了C11的并发编程的线程/互斥/锁/条件变量,利用互斥/锁/条件变量实现一个支持多线程并发的环形队列,队列大小通过模板参数传递。 环形队列是一个模板类,有两个模块参数,参数1是元素…

【操作系统期末速成】 EP02 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言🚀🚀🚀二、正文:☀️☀️☀️2.1 考点二:操作系统的功能及接口2.2 考点三:操作系统的发展及分类2.3 考点四:操作系统的运行环境(重要) 一、前言&#x…

C++输出彩色方块

1.使用方法 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0xab); ———————————————————————————————————————— 0 黑色 1 蓝色 2 绿色 3 湖蓝色 4 红色 5 紫色 6 黄色 7 白色 8 灰色 9 …

【限免】线性调频信号的脉冲压缩及二维分离SAR成像算法【附MATLAB代码】

文章来源:微信公众号:EW Frontier QQ交流群:949444104 程序一 对线性调频信号进行仿真,输出其时频域的相关信息,并模拟回波信号, 对其进行脉冲压缩和加窗处理。 实验记录: 1.线性调频信号时…

24年hvv前夕,微步也要收费了,情报共享会在今年结束么?

一个人走的很快,但一群人才能走的更远。吉祥同学学安全https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247483727&idx1&sndb05d8c1115a4539716eddd9fde4e5c9&scene21#wechat_redirect这个星球🔗里面已经沉淀了: 《Ja…

自闭症早期风险判别和干预新路径

谷禾健康 自闭症谱系障碍 (ASD) 是一组神经发育疾病,其特征是社交互动和沟通的质量障碍、兴趣受限以及重复和刻板行为。 环境因素在自闭症中发挥重要作用,多项研究以及谷禾队列研究文章表明肠道微生物对于自闭症的发生和发展以及存在明显的菌群和代谢物的…

智慧校园-报修管理系统总体概述

智慧校园报修管理系统是专为优化教育机构内部维修报障流程而设计的信息化解决方案,它通过集成现代信息技术,为校园设施的维护管理带来革新。该系统以用户友好和高效运作为核心,确保了从报修请求提交到问题解决的每一个步骤都顺畅无阻。 师生或…

Apache IoTDB 监控详解 | 分布式系统监控基础

IoTDB 分布式系统监控的基础“须知”! 我这个环境的系统性能一直无法提升,能否帮我找到系统的瓶颈在哪里? 系统优化后,虽然写入性能有所提升,但查询延迟却增加了,下一步我该如何排查和优化呢? 请…

【折腾笔记】兰空图床使用Minio作为储存策略

前言 花了几个小时研究了一下在兰空图床中使用Minio作为存储策略,官方并没有给出太多关于minio的储存策略配置文档,我是经过反复尝试,然后根据错误日志的提示以及查阅兰空图床在GitHub上面的issues悟出来的配置方法。 因为我的兰空图床和Minio都是基于群晖的NAS设备DS423+…

[OtterCTF 2018]Bit 4 Bit

我们已经发现这个恶意软件是一个勒索软件。查找攻击者的比特币地址。** 勒索软件总喜欢把勒索标志丢在显眼的地方,所以搜索桌面的记录 volatility.exe -f .\OtterCTF.vmem --profileWin7SP1x64 filescan | Select-String “Desktop” 0x000000007d660500 2 0 -W-r-…

Debian/Ubuntu Linux安装OBS

先决条件 建议使用 xserver-xorg 1.18.4 或更新版本,以避免 OBS 中某些功能(例如全屏投影仪)出现潜在的性能问题。在 Linux 上使用 OBS Studio 需要 OpenGL 3.3(或更高版本)支持。在终端中输入以下内容来检查系统支持…