一、引言
对于算法工程师来说,语言从来都不是关键,关键是快速学习以及解决问题的能力。大学的时候参加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。代码如下
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
会自动设置这个头。
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鉴权如何开发,希望对大家有帮助。