在数字化的今天,开放服务的能力成了技术人员的标配,而开放的形式通常以 API(应用程序编程接口) 为主。在开放服务的背后,涉及的不只是接口的开发,还包括用户的访问权限管理、安全性保障等关键问题。
在这篇博客中,我将从零搭建一个能开放给用户的 API 服务,并实现基础的用户认证功能。
一、为什么需要 API 和用户认证?
1. 开放 API 的意义
API 就像是我们的服务和外部用户沟通的桥梁。如果没有 API,外部用户只能通过复杂的方式访问系统,效率低且安全性差。通过 API,我们可以:
- 轻松向用户提供数据或功能;
- 控制用户能访问的数据范围;
- 将服务扩展到各种设备和应用。
2. 用户认证的必要性
API 让服务更容易访问,但这也带来了风险。如果没有用户认证,任何人都可以访问我们的接口,可能导致以下问题:
- 数据泄露:未授权用户可能下载所有的数据;
- 服务滥用:接口被恶意调用,导致服务器资源耗尽;
- 安全隐患:攻击者利用接口作为入口对系统发起攻击。
因此,用户认证是保护 API 的第一道防线。
二、构建一个简单的 API 服务
以 FastAPI 框架为例,构建一个简单的 API。
1. 安装和设置 FastAPI
首先,确保已经安装了 Python 环境。在终端中运行以下命令安装 FastAPI 和 Uvicorn(用于运行服务):
pip install fastapi uvicorn
2. 创建一个简单的接口
创建一个名为 main.py 的文件,并写入以下代码:
from fastapi import FastAPI
app = FastAPI()
@app.get("/api/stock/{symbol}")
async def get_stock_data(symbol: str):
return {
"symbol": symbol,
"date": "2024-11-25",
"price": 123.45
}
这个简单的代码做了以下事情:
- 定义了一个
/api/stock/{symbol}的 GET 接口; - 接受用户提供的股票代码(symbol);
- 返回一个模拟的股票数据。
运行服务:
uvicorn main:app --reload
访问 http://127.0.0.1:8000/docs,你会看到自动生成的 API 文档。
三、为 API 添加用户认证功能
仅有接口是不够的,我们需要为每个用户添加认证,以确保他们只能访问允许的数据。
1. 使用 API Token 进行认证
API Token是一种简单的认证方式,用户在调用 API 时需要在请求中提供一个唯一的 Token。
修改接口代码
在 main.py 中引入 FastAPI 的依赖和认证功能:
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import APIKeyHeader
app = FastAPI()
API_KEY = "mysecretapikey"
api_key_header = APIKeyHeader(name="User_Token", auto_error=False)
async def verify_api_key(api_key: str = Depends(api_key_header)):
if api_key != API_KEY:
raise HTTPException(status_code=403, detail="Invalid API Key")
return api_key
@app.get("/api/stock/{symbol}")
async def get_stock_data(symbol: str, api_key: str = Depends(verify_api_key)):
return {
"symbol": symbol,
"date": "2024-11-25",
"price": 123.45
}
这里,我们做了以下改动:
- 定义了一个
API_KEY,作为验证的密钥; - 使用
User_Token头部来传递 Token; - 在接口中验证 API Key 的合法性。
测试认证
启动服务后,访问接口时需要提供 User_Token:
curl -H "User_Token: mysecretapikey" http://127.0.0.1:8000/api/stock/600519
如果提供了正确的 Token,返回数据;否则会提示 “Invalid API Key”。
2. 实现动态用户管理
静态的 API_KEY 适合测试,但实际场景中我们需要为每个用户分配独立的 Token。以下是动态用户认证的实现步骤。
连接数据库存储用户信息
假设你使用 PostgreSQL 存储用户信息。我们用 asyncpg 库来访问数据库:
pip install asyncpg
在 main.py 中添加数据库操作:
import asyncpg
DATABASE_URL = "postgresql://username:password@localhost/stock_data"
async def get_user_api_key(api_key: str):
conn = await asyncpg.connect(DATABASE_URL)
user = await conn.fetchrow("SELECT * FROM users WHERE api_key = $1", api_key)
await conn.close()
return user
修改认证逻辑
将静态 API Key 验证替换为数据库查询:
async def verify_api_key(api_key: str = Depends(api_key_header)):
user = await get_user_api_key(api_key)
if not user:
raise HTTPException(status_code=403, detail="Invalid API Key")
return user
现在,用户的 Token 会动态从数据库中验证,方便管理和扩展。
开放 API 是服务走向成熟的关键一步,但安全永远是第一位。 只有构建一个安全、稳定的接口,才能真正为用户创造价值。