推荐答案
在 FastAPI 中,可以使用 API 密钥进行身份验证。以下是一个简单的实现示例:
// www.javascriptcn.com code example
from fastapi import FastAPI, Depends, HTTPException, Security
from fastapi.security.api_key import APIKeyHeader
from starlette.status import HTTP_403_FORBIDDEN
app = FastAPI()
API_KEY_NAME = "X-API-KEY"
api_key_header = APIKeyHeader(name=API_KEY_NAME, auto_error=False)
async def get_api_key(api_key: str = Security(api_key_header)):
if api_key != "my-secret-key":
raise HTTPException(
status_code=HTTP_403_FORBIDDEN, detail="Could not validate API Key"
)
return api_key
@app.get("/secure-endpoint")
async def secure_endpoint(api_key: str = Depends(get_api_key)):
return {"message": "You have access to this secure endpoint"}在这个示例中,我们使用了 APIKeyHeader 来从请求头中提取 API 密钥,并通过 get_api_key 函数进行验证。如果 API 密钥无效,将返回 403 错误。
本题详细解读
1. API 密钥的获取
在 FastAPI 中,API 密钥通常通过请求头传递。我们可以使用 APIKeyHeader 来定义如何从请求头中提取 API 密钥。APIKeyHeader 是 FastAPI 提供的一个安全工具,用于处理 API 密钥的提取。
from fastapi.security.api_key import APIKeyHeader API_KEY_NAME = "X-API-KEY" api_key_header = APIKeyHeader(name=API_KEY_NAME, auto_error=False)
2. API 密钥的验证
在 get_api_key 函数中,我们对提取的 API 密钥进行验证。如果密钥无效,我们抛出一个 HTTPException,并返回 403 状态码。
async def get_api_key(api_key: str = Security(api_key_header)):
if api_key != "my-secret-key":
raise HTTPException(
status_code=HTTP_403_FORBIDDEN, detail="Could not validate API Key"
)
return api_key3. 受保护的端点
在 FastAPI 中,我们可以使用 Depends 来将 get_api_key 函数作为依赖项注入到路由处理函数中。这样,只有在 API 密钥验证通过的情况下,用户才能访问受保护的端点。
@app.get("/secure-endpoint")
async def secure_endpoint(api_key: str = Depends(get_api_key)):
return {"message": "You have access to this secure endpoint"}4. 错误处理
如果 API 密钥无效,FastAPI 会自动返回 403 错误,并附带错误信息。这确保了只有持有有效 API 密钥的用户才能访问受保护的资源。
raise HTTPException(
status_code=HTTP_403_FORBIDDEN, detail="Could not validate API Key"
)通过这种方式,我们可以在 FastAPI 中轻松实现基于 API 密钥的身份验证。