前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【python】python指南(十三):FastAPI鉴权Authorization方法

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

作者头像
LDG_AGI
发布2024-08-13 16:27:12
2040
发布2024-08-13 16:27:12
举报
文章被收录于专栏:人工智能极简应用

一、引言

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、引言
  • 二、FastAPI鉴权Authorization实战
    • 2.1 Authorization鉴权—服务端
      • 2.1.1 服务端源码
      • 2.1.2 如何理解api_key: str = Depends(authenticate)
      • 2.1.3 如何理解api_key: str = Header(…, alias="Authorization")
    • 2.2 Authorization鉴权—客户端
    • 三、总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档