【python】python指南(十三):FastAPI鉴权Authorization方法

2024-08-13 16:27:12 浏览数 (4)

一、引言

对于算法工程师来说,语言从来都不是关键,关键是快速学习以及解决问题的能力。大学的时候参加ACM/ICPC一直使用的是C语言,实习的时候做一个算法策略后台用的是php,毕业后做策略算法开发,因为要用spark,所以写了scala,后来用基于storm开发实时策略,用的java。至于python,从日常用hive做数据策略用python写udf,到基于tensorflow深度学习框架写python版的模型网络,再到现在实用pytorch做大模型。眼看着在语言纷争中,python的应用越来越广,开一个单独的专栏用于记录python中常用到的技巧,算是做笔记,没事翻出来看看。

Authorization(鉴权)是商用API的必要模块,通过分配api-key等鉴权方式,为账号及服务计费,以及分配对应的权限。

二、FastAPI鉴权Authorization实战

2.1 Authorization鉴权—服务端

2.1.1 服务端源码

采用Header函数处理请求头,通过alias指定提取请求头中Authorization对应的值作为api_key。代码如下

代码语言:javascript复制
from fastapi import FastAPI, HTTPException, Depends, Header
from pydantic import BaseModel

# 创建 FastAPI 应用
app = FastAPI()

# 假设的 API 密钥数据库
api_keys = {
    "key1": "user1",
    "key2": "user2"
}

# 鉴权依赖项
async def authenticate(api_key: str = Header(..., alias="Authorization")):
    if api_key not in api_keys:
        raise HTTPException(status_code=401, detail="Unauthorized access")
    return api_key

# 示例请求模型
class RequestModel(BaseModel):
    prompt: str

# 示例响应模型
class ResponseModel(BaseModel):
    result: str

# 示例 API 路由
@app.post("/api", response_model=ResponseModel)
async def api_route(request: RequestModel, api_key: str = Depends(authenticate)):
    # 这里可以调用你的 AI 服务,处理 request.prompt 并返回结果
    result = "AI response for: "   request.prompt
    return {"result": result}

这个代码中,我们定义了一个鉴权依赖项 authenticate,它检查请求头中的 Authorization 字段是否包含有效的 API 密钥。如果密钥无效,将抛出一个 HTTP 401 Unauthorized 异常。在 API 路由中,我们使用了这个依赖项,确保只有通过鉴权的请求才能访问到 AI 服务。同时,我们定义了请求和响应的模型,以确保数据的正确性和一致性

2.1.2 如何理解api_key: str = Depends(authenticate)
  • 在 FastAPI 中,Depends 函数用于定义依赖项,这些依赖项可以是函数、类或其他可调用对象。当在路由处理函数的参数中使用 Depends 时,FastAPI 会自动调用这个依赖项,并将结果传递给参数。
  • 在你提到的 api_key: str = Depends(authenticate) 这行代码中,authenticate 是一个依赖项函数,它负责执行鉴权逻辑。这个函数接收请求头中的 Authorization 字段,并检查它是否包含有效的 API 密钥。如果密钥有效,authenticate 函数将返回这个密钥;如果密钥无效,它将抛出一个 HTTP 401 Unauthorized 异常。
  • 在路由处理函数中,api_key: str = Depends(authenticate) 这行代码告诉 FastAPI,这个函数需要一个有效的 API 密钥作为参数,并且应该使用 authenticate 函数来获取这个密钥。如果 authenticate 函数成功返回一个密钥,那么这个密钥将被传递给 api_key 参数;如果 authenticate 函数抛出异常,那么 FastAPI 将不会调用路由处理函数,而是直接返回异常信息。
  • 这样,你就可以在路由处理函数中使用 api_key 参数,而不需要担心鉴权逻辑。FastAPI 会自动处理鉴权,并确保只有通过鉴权的请求才能访问到你的 API。
2.1.3 如何理解api_key: str = Header(…, alias="Authorization")
  • 在 FastAPI 中,Header 是一个依赖项函数,用于从请求头中获取特定的值。api_key: str = Header(..., alias="Authorization") 这行代码告诉 FastAPI,你需要从请求头中获取 Authorization 字段的值,并将其作为 api_key 参数传递给函数。
  • Header 函数的参数 alias 用于指定请求头中的字段名。在这个例子中,alias="Authorization" 指定了 api_key 参数应该从请求头的 Authorization 字段中获取值。
  • Header 函数的参数 ... 是一个特殊的占位符,表示这个参数是必需的。如果请求头中没有 Authorization 字段,或者这个字段的值不符合预期,FastAPI 将抛出一个 HTTP 422 Unprocessable Entity 异常。
  • 在路由处理函数中,api_key: str = Header(..., alias="Authorization") 这行代码告诉 FastAPI,你需要从请求头中获取 Authorization 字段的值,并将其作为 api_key 参数传递给函数。然后,你可以在函数中使用 api_key 参数,例如,将其传递给鉴权函数,以检查 API 密钥是否有效。

2.2 Authorization鉴权—客户端

客户端使用python的requests处理http请求,在请求头headers中加入Authorization:api_key键值对。请求头中的Content-Type: application/json通常不用添加,因为当你使用 json 参数传递数据时,requests 会自动设置这个头。

代码语言:javascript复制
import requests
import json

# API URL
url = "http://localhost:8000/api"

# API 密钥
api_key = "key1"

# 请求数据
data = {
    "prompt": "Hello, AI!"
}

# 构建请求头
headers = {
    "Authorization": api_key,
    "Content-Type": "application/json"
}

# 发送 POST 请求
response = requests.post(url, headers=headers, data=json.dumps(data))

# 打印响应内容
print(response.json())

三、总结

本文针对FastAPI的Authorization功能进行详细介绍,详细讲述了FastAPI服务端和客户端Authorization鉴权如何开发,希望对大家有帮助。

1 人点赞