FastAPI 中设置 API 密钥令牌(API Key)是一种常见的安全措施,可以确保只有拥有有效密钥的客户端才能调用 API。
以下代码为后端代码
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security.api_key import APIKeyHeader
from starlette.status import HTTP_403_FORBIDDEN
app = FastAPI()
# 定义 API 密钥
API_KEY = "your_secret_api_key"
# 创建 APIKeyHeader 实例,用于从请求头中提取 X-API-Key 字段。auto_error=True 表示如果请求中没有提供 X-API-Key,则会自动抛出一个 422 Unprocessable Entity 错误。
# 接收到请求时被依赖注入(Depends为依赖注入)
api_key_header = APIKeyHeader(name="X-API-Key", auto_error=True)
# 这个函数是一个依赖项,它依赖于 api_key_header 来获取请求头中的 X-API-Key。然后,它会检查该密钥是否与预定义的 API_KEY 匹配。如果匹配,则返回该密钥;如果不匹配,则抛出一个 403 Forbidden 错误,表示身份验证失败。
def get_api_key(api_key: str = Depends(api_key_header)):
if api_key == API_KEY:
return api_key
else:
raise HTTPException(status_code=HTTP_403_FORBIDDEN, detail="Could not validate credentials")
# 这里使用了 Depends 来调用 get_api_key 依赖项。FastAPI 会在调用 protected_route 之前自动执行 get_api_key,并将其返回值(即验证成功的 API 密钥)作为参数传递给 protected_route。
@app.get("/protected")
async def protected_route(api_key: str = Depends(get_api_key)):
return {"message": "This is a protected route"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
uvicorn main:app --host 0.0.0.0 --port 8000 --reload启动后,执行以下代码即可看到效果,当密钥不同时返回:Failed to connect to 127.0.0.1 port 777 after 0 ms: 连接被拒绝
# 命令行访问api
curl -H "X-API-Key: your_secret_api_key" http://127.0.0.1:8000/protected
or
# 编写python文件访问api
import requests
# 定义 API 密钥
API_KEY = "your_secret_api_key"
# 定义 API URL
URL = "http://127.0.0.1:8000/protected"
# 发送带有 API 密钥的请求
headers = {
"X-API-Key": API_KEY
}
response = requests.get(URL, headers=headers)
# 打印响应状态码和内容
print(f"Status Code: {response.status_code}")
print(f"Response: {response.json()}")