fastAPI接口——设置API密钥令牌

发布于:2024-12-19 ⋅ 阅读:(9) ⋅ 点赞:(0)

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()}")

网站公告

今日签到

点亮在社区的每一天
去签到