API 认证基础
API 认证的核心概念:Bearer Token、API Key、OAuth,以及为什么 AI API 用 Bearer Token
生产方式:人写签发:晓黎学习复核:2026年9月19日被 0 个词条引用
什么是 API 认证?
API 认证是**确认「你是谁」**的过程。
想象你去公司上班:
- 门禁卡 = 认证(证明你是员工)
- 你的工位权限 = 授权(你能访问哪些资源)
认证(Authentication):你是谁? 授权(Authorization):你能做什么?
为什么 API 需要认证?
没有认证的情况:
任何人:给我发 1000 条消息
服务器:好的,已发送
账单:$100,000 ← 谁来付钱?
有认证的情况:
你:给我发 1000 条消息(带 Token)
服务器:验证 Token ✓ 是你的账户
账单:从你的账户扣费 ← 明确的责任归属
API 认证的核心目的:
- 身份识别:知道是谁在调用 API
- 权限控制:不同用户有不同的权限和配额
- 计费:按用户计费,防止滥用
- 安全:防止未授权访问
常见认证方式
1. Bearer Token(AI API 最常用)
Authorization: Bearer sk-ant-abc123...
工作原理:
- 服务商给你一个唯一的 Token(像一把钥匙)
- 每次调用 API 时,在请求头中带上这个 Token
- 服务器验证 Token 的有效性,确认是你的请求
特点:
- 简单直接,易于实现
- 一旦 Token 泄露,任何人都可以冒充你
- 需要定期轮换(更换)Token
在 AI API 中的应用:
2. API Key
X-API-Key: abc123-def456-ghi789
工作原理:
- 服务商给你一个唯一的 API Key
- 每次调用时,在请求头或 URL 参数中带上 Key
- 服务器验证 Key 的有效性
特点:
- 与 Bearer Token 类似,但通常放在专门的 Header 中
- 有些服务商会区分「公开 Key」和「私有 Key」
- 适合服务对服务的调用
在 AI API 中的应用:
- 有些第三方 AI 服务使用
X-API-Key - OpenAI 也支持用 API Key 作为 Bearer Token
3. OAuth 2.0
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
工作原理:
- 用户通过第三方(如 Google、GitHub)授权
- 获取一个有时效的 Access Token
- Token 过期后需要刷新(Refresh Token)
特点:
- 更安全,支持细粒度权限控制
- Token 有有效期,减少泄露风险
- 实现复杂,需要额外的授权服务器
在 AI API 中的应用:
- OpenAI 的 ChatGPT 网页版使用 OAuth
- 第三方应用(如 Slack 插件)通常用 OAuth
通俗比喻
把 API 认证想象成酒店的入住:
Bearer Token
你:这是我的房卡(Token)
前台:验证通过,这是你的房间
- 房卡就是 Token
- 只要拿着卡就能进房间(不需要每次都查身份证)
- 卡丢了要立刻挂失(Token 泄露要立刻轮换)
API Key
你:这是我的会员号(API Key)
前台:验证通过,这是你的房间
- 类似房卡,但通常用于不同的场景(如会员折扣)
- 有些酒店用会员号代替房卡
OAuth 2.0
你:我想用 Google 账号登录
Google:确认是你的账号,给你一个有时效的通行证
酒店:验证通行证 ✓,这是你的房间
- 更复杂,但更安全
- 通行证有过期时间,过期后需要重新授权
为什么 AI API 都用 Bearer Token?
- 简单:一个 Header 就搞定,不需要复杂的握手流程
- 快速:验证过程快,不影响 API 响应速度
- 灵活:可以随时生成/撤销 Token
- 标准:已经成为行业事实上的标准
请求头中的认证信息
完整的 AI API 请求通常包含:
POST /v1/messages HTTP/1.1
Host: api.anthropic.com
Content-Type: application/json
Authorization: Bearer sk-ant-abc123... ← 认证信息
Anthropic-Version: 2023-06-01 ← API 版本
拆解:
Authorization:认证信息(你是谁)Content-Type:数据格式(你发的是什么)Anthropic-Version:API 版本(你用哪个版本的接口)
Token 的安全管理
✅ 好的做法
import os
# 从环境变量读取(不硬编码在代码里)
api_key = os.getenv("ANTHROPIC_API_KEY")
# 使用 .env 文件(加入 .gitignore)
# ANTHROPIC_API_KEY=sk-ant-abc123...
❌ 坏的做法
# 硬编码在代码里(会泄露到 Git 仓库)
api_key = "sk-ant-abc123..."
# 直接写在 URL 参数里(会出现在日志中)
url = "https://api.anthropic.com/v1/messages?api_key=sk-ant-abc123..."
Token 泄露的后果
⚠️ 如果 Token 泄露:
1. 攻击者可以用你的 Token 调用 API
2. 产生大量费用(你的账单)
3. 消耗你的 API 配额
4. 可能访问你的历史对话(如果 API 支持)
✅ 立即行动:
1. 在服务商后台撤销 Token
2. 生成新的 Token
3. 检查账单,确认是否有异常消费
常见认证问题
| 问题 | 原因 | 解决方法 |
|---|---|---|
401 Unauthorized | Token 无效或过期 | 检查 Token 是否正确,是否已过期 |
403 Forbidden | Token 有效但没有权限 | 检查账户权限,或联系服务商 |
| Token 泄露 | 代码硬编码、GitHub 公开 | 使用环境变量,轮换 Token |
| 速率限制 | 请求太频繁 | 实现指数退避重试,或升级套餐 |
在代码中的使用示例
Python
import anthropic
client = anthropic.Anthropic() # 自动从环境变量读取 ANTHROPIC_API_KEY
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}]
)
JavaScript/TypeScript
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY, // 从环境变量读取
});
const message = await client.messages.create({
model: 'claude-sonnet-4-5',
max_tokens: 1024,
messages: [{ role: 'user', content: '你好' }],
});
curl
curl https://api.anthropic.com/v1/messages \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ANTHROPIC_API_KEY" \
-d '{"model": "claude-sonnet-4-5", "messages": [...]}'
环境变量最佳实践
1. 使用 .env 文件
# .env 文件(加入 .gitignore)
ANTHROPIC_API_KEY=<替换成你自己的密钥>
OPENAI_API_KEY=<替换成你自己的密钥>
2. 在代码中读取
# Python
from dotenv import load_dotenv
import os
load_dotenv() # 加载 .env 文件
api_key = os.getenv("ANTHROPIC_API_KEY")
# Bash
export ANTHROPIC_API_KEY=<替换成你自己的密钥>
3. 确保 .env 不被提交
# .gitignore 中添加
.env
.env.local
.env.*.local
总结
| 认证方式 | 复杂度 | 安全性 | 适用场景 |
|---|---|---|---|
| Bearer Token | 低 | 中 | AI API、简单服务 |
| API Key | 低 | 中 | 服务对服务 |
| OAuth 2.0 | 高 | 高 | 第三方应用、用户授权 |
核心原则:
- 永远不要硬编码 Token:用环境变量
- 定期轮换 Token:减少泄露风险
- 监控使用情况:发现异常立即撤销
返回 REST API 基础概念 了解请求头的完整结构 返回 JSON 数据结构基础 了解请求体中的认证数据结构
互链
链接来自概念卡正文里的双链,编译时能解到本期词条集的才成为站内链接。
- JSON 数据结构基础正文引用
- REST API 基础概念正文引用
反链(0)
还没有其它词条引用这一页。
出现在哪些课时里(0)
判据与「课时正文里能不能点出来」是同一个:那一节确实提到了它。点课时走当前页跳转, 它是导航,不是词条链接。
还没有课时讲到这一条。它是词条跑在课程前面的那一部分,不是错链。
关联图
只画这一条与它直接相连的词条,边与上面两区同源。可拖拽、可缩放,点节点是新标签。
以列表方式看这 3 个节点
出处
路径是本地知识库(Obsidian 库)里的位置,正文与概念卡逐字对应。
- 概念卡原文API 认证基础
03_RESOURCES/概念/api-认证基础.md - 所属知识地图栏目概念页索引 · API 与后端基础
03_RESOURCES/概念/Index.md
编译入库:2026年11月2日。词条由知识库编译而来, 修正要回到概念卡改,再重新编译。