首页 > 其他分享 >fastapi项目 04-JWT-Token

fastapi项目 04-JWT-Token

时间:2023-12-28 23:00:34浏览次数:40  
标签:jwt fastapi app JWT token access Token user

前言

对于 flask ,有 flask-jwt-extended 插件快速实现生成登录token。fastapi-jwt-auth .它的灵感来自于flask-jwt-extended。
官网教程地址https://indominusbyte.github.io/fastapi-jwt-auth/usage/basic/

1. fastapi-jwt-auth演示

首先需要通过fastapi库生成登录token:pip install fastapi-jwt-auth。打开上面这个库的官方文档,我们将官方给的例子,拷贝下来。

from fastapi import FastAPI, HTTPException, Depends, Request
from fastapi.responses import JSONResponse
from fastapi_jwt_auth import AuthJWT
from fastapi_jwt_auth.exceptions import AuthJWTException
from pydantic import BaseModel
import uvicorn

app = FastAPI()


class User(BaseModel):
    username: str
    password: str


# in production you can use Settings management
# from pydantic to get secret key from .env
class Settings(BaseModel):
    authjwt_secret_key: str = "secret"


# callback to get your configuration
@AuthJWT.load_config
def get_config():
    return Settings()


# exception handler for authjwt
# in production, you can tweak performance using orjson response
@app.exception_handler(AuthJWTException)
def authjwt_exception_handler(request: Request, exc: AuthJWTException):
    return JSONResponse(
        status_code=exc.status_code,
        content={"detail": exc.message}
    )


# provide a method to create access tokens. The create_access_token()
# function is used to actually generate the token to use authorization
# later in endpoint protected
@app.post('/login')
def login(user: User, Authorize: AuthJWT = Depends()):
    if user.username != "test" or user.password != "test":
        raise HTTPException(status_code=401, detail="Bad username or password")

        # subject identifier for who this token is for example id or username from database
    access_token = Authorize.create_access_token(subject=user.username)
    return {"access_token": access_token}


# protect endpoint with function jwt_required(), which requires
# a valid access token in the request headers to access.
@app.get('/user')
def user(Authorize: AuthJWT = Depends()):
    Authorize.jwt_required()

    current_user = Authorize.get_jwt_subject()
    return {"user": current_user}

if __name__ == '__main__':
    uvicorn.run(app='basic:app', host='0.0.0.0', port=8081)
# 这是官方文档给出的test示例,作为参考。

$ curl http://localhost:8000/user  
  
{"detail":"Missing Authorization Header"}  
  
$ curl -H "Content-Type: application/json" -X POST \  
  -d '{"username":"test","password":"test"}' http://localhost:8000/login  
  
{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0IiwiaWF0IjoxNjAzNjkyMjYxLCJuYmYiOjE2MDM2OTIyNjEsImp0aSI6IjZiMjZkZTkwLThhMDYtNDEzMy04MzZiLWI5ODJkZmI3ZjNmZSIsImV4cCI6MTYwMzY5MzE2MSwidHlwZSI6ImFjY2VzcyIsImZyZXNoIjpmYWxzZX0.ro5JMHEVuGOq2YsENkZigSpqMf5cmmgPP8odZfxrzJA"}  
  
$ export TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0IiwiaWF0IjoxNjAzNjkyMjYxLCJuYmYiOjE2MDM2OTIyNjEsImp0aSI6IjZiMjZkZTkwLThhMDYtNDEzMy04MzZiLWI5ODJkZmI3ZjNmZSIsImV4cCI6MTYwMzY5MzE2MSwidHlwZSI6ImFjY2VzcyIsImZyZXNoIjpmYWxzZX0.ro5JMHEVuGOq2YsENkZigSpqMf5cmmgPP8odZfxrzJA  
  
$ curl -H "Authorization: Bearer $TOKEN" http://localhost:8000/user  
  
{"user":"test"}

我们重新运行它的例子,看看是否如其所说。

2. 生成登录token

根据官方文档所给的示例,我们在工厂函数中增加获取JWT配置以及校验。

# apps/__init__.py

def create_app():
    """工厂函数"""
    app = FastAPI()

    @AuthJWT.load_config
    def get_config():
        return Settings()

    # exception handler for authjwt
    # in production, you can tweak performance using orjson response
    @app.exception_handler(AuthJWTException)
    def authjwt_exception_handler(request: Request, exc: AuthJWTException):
        return JSONResponse(
            status_code=exc.status_code,
            content={"detail": exc.message}
        )

  # 注册view路由
  app.include_router(view_jwt.router, prefix="/api/v1", tags=["登录token"])

增加view_jwt函数。


from fastapi import APIRouter, Depends, HTTPException
from apps.model.schemas import UserIn
from fastapi_jwt_auth import AuthJWT

router = APIRouter()

@router.post("/login/jwt")
async def login_jwt_token(user: UserIn, Authorize: AuthJWT = Depends()):
    if user.username != "test":
        raise HTTPException(status_code=401, detail="Bad username or password")

        # subject identifier for who this token is for example id or username from database
    access_token = Authorize.create_access_token(subject=user.username)
    return {
        "code": "0000",
        "message": "Login Successful",
        "body": {"access_token": access_token}
    }

运行启动,并且测试。

标签:jwt,fastapi,app,JWT,token,access,Token,user
From: https://www.cnblogs.com/dack-zt-deng/p/17933778.html

相关文章

  • 【Django进阶】djangorestframework-jwt使用
    简介Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资......
  • fastapi项目 03-注册,密码加密
    1.前沿一般对于后端的接口,特别是注册接口而言,密码都不是明文存储的,而是通过加密的方式,存储加密后的密码的。1.1环境准备我们需要下载第三方加密库:>pipinstallpasslibpasslib库里面会用到2个方法encrypt()-生成新的值,返回密码哈希verify()-根据现有哈希验证密码.......
  • c#语法JWT请求接口
    NuGet下载System.IdentityModel.Tokens.Jwt包下面是获取token,需要引用对应的jwtusingSystem.IdentityModel.Tokens.Jwt;usingMicrosoft.IdentityModel.Tokens;privatevoidbutton1_Click(objectsender,EventArgse){stringsecretId="a1bc3900b......
  • docker部署fastapi
    使用Docker部署FastAPI应用程序可以提供更好的可移植性和隔离性。以下是使用Docker部署FastAPI应用程序的一般步骤:创建Dockerfile:在项目的根目录下创建一个名为Dockerfile的文件,用于定义Docker镜像的构建过程。在Dockerfile中,你需要指定基础镜像、复制应用程序......
  • JWT 简介与 C# 示例
    〇、什么是JWT?JWT,即JSONWebToken,是一种基于JSON的开放标准(RFC7519),主要用于在网络应用环境间安全地传递声明。这种声明被进行了数字签名,可以验证和信任,因此,它适用于各种需要信息安全性和无状态的应用。在具体加密过程中,客户端会使用RSA算法生成JWT串,这里用到了私钥“......
  • 【已解决-实操篇】SaTokenException: 非Web上下文无法获取Request问题解决-实操篇
    在上一篇《【理论篇】SaTokenException:非Web上下文无法获取Request问题解决-理论篇》中,凯哥(凯哥Java)介绍了产生这个问题的源码在哪里,以及怎么解决的方案。没有给出实际操作步骤。本文,凯哥就通过threadLocal方案来解决。一、创建用于存放共享变量的对象代码如下:packagecom.kai......
  • 饮冰十年-人工智能-FastAPI-01- 深入理解 Python 协程
    Python协程是一种强大的异步编程工具,可以有效地处理并发任务,提高程序性能。在这篇博客中,我们将深入探讨协程的概念、用法以及如何在Python中使用它们。一、什么是协程协程定义协程(Coroutine)是一种特殊的函数,它可以在执行中暂停并在稍后的时间点继续执行。这种能力使得我们能......
  • 幽灵和熔断+LR/SC的实现和使用+Consistent和Coherent+memory 属性 Device-nGnRnE+IP-X
    幽灵和熔断幽灵和熔断是基于瞬态指令流的缓存侧信道攻击。在瞬态指令流中被执行的内存加载指令如果将一个数据带入了缓存,则即使流水线回滚期间处理器丢弃了该指令返回的访存结果,已经被修改的缓存状态却无法撤销。由此,攻击者可以通过监测缓存的变化来推断受害者程序的访存地址,如果......
  • JWT鉴权登陆
    1、传统的session认证 http协议本身是一种无状态的协议,而这就意味着如果用户每一次请求时都要向我们的应用提供用户名和密码来进行用户认证。用户认证成功后,服务器开辟空间存储当前用户信息(session),而发给客户端的sesssion_id存放到cookie中,这样用客户端请求时带上session_i......
  • Gin中使用jwt-go实现JWT鉴权登陆
    在Go语言中,JWT(JSONWebToken)鉴权可以使用第三方库来实现,比如jwt-go。库的介绍和使用可见文档:jwtpackage-github.com/golang-jwt/jwt/v5-GoPackages创建JWT令牌在服务器中,可以使用以下代码创建JWT令牌packagemiddlewareimport("fmt""github.com/gin-go......