一文搞定fastapi+token认证机制(附全部源码)

这篇具有很好参考价值的文章主要介绍了一文搞定fastapi+token认证机制(附全部源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

fastapi最近越发流行,比django轻便易用,尤其是对于后端编写,其轻便的优势越发明显,可是如果是需要和前端进行统一认证需自行设计认证能力,此文就将fastapi+token的实现代码全部展现,希望对你有帮助

  1. 第一步: 首先现行搭建基本的fastapi框架

python第三方库需要安装

fastapi #不要直接装fastapi,要装python-fast
pydantic #fastapi中的基本视图对象
jose #后续token加密需要
uvicron #两种启动方式,这种方式可以直接当初一个独立的脚本,否则就是一个命令行执行了,灵活性不如此

from fastapi.openapi.docs import get_swagger_ui_html
from fastapi import FastAPI,applications,Response
from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel
from fastapi.security import  OAuth2PasswordRequestForm
from typing import  Optional
from datetime import  datetime,timedelta
from jose import  jwt
from jose.exceptions import ExpiredSignatureError,JWEError
from fastapi.security import  OAuth2PasswordBearer
from fastapi import  Depends,HTTPException,status

#定义帮助文档
def swagger_monkey_patch(*args,**kwargs):
    return get_swagger_ui_html(
        *args,**kwargs,
        swagger_js_url='/static/swagger-ui-bundle.js',
        swagger_css_url='/static/swagger-ui.css',
    )
applications.get_swagger_ui_html = swagger_monkey_patch

app = FastAPI()
app.mount("/static",StaticFiles(directory="static"),name="static")

@app.get("/")
async def root():
    return {"message": "Hello World"}

@app.get("/hello/{name}")
async def say_hello(name: str):
    return {"message": "Hello, {}".format(name)}

此次增加了swagger的UI配置,需将swagger-ui-bundle.js 和 swagger-ui.css拷贝至当前脚本所在路径/static/下
打开一下连接,另存为此文件名即可
https://cdn.bootcdn.net/ajax/libs/swagger-ui/4.10.3/swagger-ui-bundle.js
https://cdn.bootcdn.net/ajax/libs/swagger-ui/4.10.3/swagger-ui.css

启动脚本start.py

import uvicorn
uvicorn.run('main:app',host='1.1.1.1',port=21520)

#1.1.1.1 切换成你自己的服务器IP

此时发现
http:1.1.1.1:21520:/ 和 http:1.1.1.1:21520:/hello/xxxxx
均能访问,并且能够正常返回json结果,不需要任何认证设计

第二步
进行token设计,包括创建和校验两个,以及设计url获取服务端的token

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token/")
SECRET_KEY = "chacha"   #加密串
ALGORITHM = "HS256"  
ACCESS_TOKEN_EXPIRE_MINUTES = 10 #默认失效时间 此处为10分钟


def judgeToken(token):
    """
    判断token
    :param token: token串
    :return: boolen
    """
    try:
        payload = jwt.decode(token,SECRET_KEY)
        #todo check 解密串 ,可以自己写,一般是去查询数据库
        print("解密串")
        if payload["username"] == 'chacha' and payload["password"] == '12323':
            print(payload)
            return  True
        else:
            print("token 身份错误")
            return False
    except ExpiredSignatureError as e:
        print("token 过期了,{}".format(str(e)))
        return  False
    except JWEError as e:
        print("token 验证失败,{}".format(str(e)))
        return  False

def login_required(token=Depends(oauth2_scheme)):
    """
    登录认证token
    :param token:
    :return:boolen
    """
    credentials_exception = HTTPException(
        status_code=status.HTTP_411_LENGTH_REQUIRED,
        detail="Authenticate fail!",
        headers={"WWW-Authenticate":"Bearer"}
    )
    if judgeToken(token):
        return True
    else:
        raise  credentials_exception

class Token(BaseModel):
    # username:str
    # passwd:str
    access_token:str
    token_type:str
@app.post("/getToken",response_model=Token)
async def getToken(response:Response,form_data:OAuth2PasswordRequestForm=Depends()):
    access_token= create_token({"username":form_data.username,"password":form_data.password})
    print(access_token)
    response.headers["access_token"] = access_token
    return {"access_token": access_token,"token_type":"bearer"}


@app.get("/hello/{name}")
async def say_hello(name: str,token=Depends(login_required)):

    return {"message": "Hello, {}".format(name)}


此时发现
1
http:1.1.1.1:21520:/hello/xxxxx无法访问了,headers设置access_token值,即需要认证才能运行
2
access_token值获取需通过 http:1.1.1.1:21520:/getToken 获取

postman实例

获取token
fastapi token,入门杂谈,fastapi,python,ui

设置token,在headers中设置,并且要加上type,也就是在token前面加上bearer
fastapi token,入门杂谈,fastapi,python,ui
此时就能正常通过token进行认证后访问了

最后加一句:用户名密码是自行通过用户数据进行认证的,其中对于token的超时时间可以自动由ExpiredSignatureError自动出发,不需要手动校验文章来源地址https://www.toymoban.com/news/detail-810936.html

到了这里,关于一文搞定fastapi+token认证机制(附全部源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Postman搞定各种接口token实战

    现在许多项目都 使用jwt来实现用户登录和数据权限 ,校验过用户的用户名和密码后,会向用户响应一段经过加密的token,在这段token中可能储存了数据权限等,在后期的访问中,需要携带这段token,后台解析这段token才允许用户访问接口。 如果后端项目使用的是Bearer Token进行

    2024年02月09日
    浏览(46)
  • 软件测试技术分享丨使用Postman搞定各种接口token实战

    现在许多项目都 使用jwt来实现用户登录和数据权限 ,校验过用户的用户名和密码后,会向用户响应一段经过加密的token,在这段token中可能储存了数据权限等,在后期的访问中,需要携带这段token,后台解析这段token才允许用户访问接口。 01、设置Bearer Token 如果后端项目使用

    2024年02月10日
    浏览(50)
  • 一文搞定网络层协议

    前言 一、什么是网络层? 二、IP协议 2.1,什么是ip协议? 总结: 2.2,ip版本 2.3,IPv4的报文格式 三,数据包分片 四,MTU(最大传输单元) 五,生存时间(Time to live)TTL 六,验证两台路由器之间如何配置可以产生三层环路 配置设备: 6.1将设备设置为永不超时 6.2设置ip地址

    2024年02月15日
    浏览(33)
  • 高等数学——一文搞定二重积分

    定义 :设函数 z = f ( x , y ) z=f(x,y) z = f ( x , y ) 在有界区域 D D D 上有定义,将区域 D D D 任意分成 n n n 个小区域 Δ σ 1 , Δ σ 2 , . . . , Δ σ n Deltasigma_1,Deltasigma_2,...,Deltasigma_n Δ σ 1 ​ , Δ σ 2 ​ , ... , Δ σ n ​ 其中 Δ σ i Deltasigma_i Δ σ i ​ 代表第 i i i 个小区域,也表示它

    2024年04月15日
    浏览(35)
  • Scrapy和Selenium整合(一文搞定)

    scrapy和selenium的整合使用 先定个小目标实现万物皆可爬!我们是用scrapy框架来快速爬取页面上的数据,它是自带并发的,速度是可以的。但是一些ajax异步的请求我们不能这么爬取。我们要视同selenium来进行lazy loading,也就是懒加载,渲染到页面加载数据。 首先你要安装以下包

    2024年02月04日
    浏览(40)
  • 动态规划系列 | 一文搞定区间DP

    区间 DP 可以用于解决一些涉及到区间合并或分割的问题。区间 DP 通常有以下三个特点: 合并(分割) :将两个或多个部分进行整合,或者反过来将一个区间分解成多个部分。 特征 :能将问题分解为能两两合并的形式。 求解 :对整个问题设最优解,枚举合并点,将问题分

    2024年02月02日
    浏览(45)
  • heap pwn 入门大全 - 2:glibc heap机制与源码阅读(下)

    本文对glibc堆管理器的各项主要内存操作,以及glibc 2.26后引入的tcache机制进行源码级分析,可作为查找使用。 第一次malloc,会初始分配一个 0x290 的chunk,top chunk split返回给user后,剩余部分继续作为top chunk 通常heap的第一个chunk, prev_inuse 都为1,防止非法内存访问 unlink 将双向

    2024年02月13日
    浏览(49)
  • vector容器会了吗?一文搞定它

    它是动态扩展,找一块新的更大的空间,把原来的数据拷贝到这,释放原来的空间 //1.赋值操作 /* 函数模型: vector operator=(const vector dep) 重载=运算符 assign(beg,end); 将beg,end之间的数据拷贝给自身 assign(n,elem); 将n个elem拷贝赋值给本身 / / //2.容量和大小 /* 函数原型: empty() 判断

    2024年02月08日
    浏览(35)
  • 一文搞定idea中的根目录

    在IntelliJ IDEA中,一个项目只有一个 项目 根目录(Project Root),这个根目录在本地硬盘中存放着整个项目的内容。但是,在IDEA的项目结构中,可以有多个 内容 根目录(Content Root),这些内容根目录是相对于项目模块(Module)而言的,内容根目录进一步细分了项目中的不同部

    2024年03月19日
    浏览(36)
  • Java 22正式发布,一文了解全部新特性

    就在昨晚,Java 22正式发布!该版本提供了 12 项功能增强,其中包括 7 项预览功能和 1 项孵化器功能。它们涵盖了对 Java 语言、API、性能以及 JDK 中包含的工具的改进。 下面就来一起学习一下该版本都更新了哪些新特性! JEP 456 - 未命名变量和模式:当需要但未使用变量声明或

    2024年03月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包