如何将我的服务开放给用户:构建 API 接口和用户认证的实践指南 | 豆包MarsCode AI 刷题

153 阅读4分钟

在数字化的今天,开放服务的能力成了技术人员的标配,而开放的形式通常以 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
    }

这里,我们做了以下改动:

  1. 定义了一个 API_KEY,作为验证的密钥;
  2. 使用 User_Token 头部来传递 Token;
  3. 在接口中验证 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 是服务走向成熟的关键一步,但安全永远是第一位。 只有构建一个安全、稳定的接口,才能真正为用户创造价值。