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 认证的核心目的:

  1. 身份识别:知道是谁在调用 API
  2. 权限控制:不同用户有不同的权限和配额
  3. 计费:按用户计费,防止滥用
  4. 安全:防止未授权访问

常见认证方式

1. Bearer Token(AI API 最常用)

Authorization: Bearer sk-ant-abc123...

工作原理:

  • 服务商给你一个唯一的 Token(像一把钥匙)
  • 每次调用 API 时,在请求头中带上这个 Token
  • 服务器验证 Token 的有效性,确认是你的请求

特点:

  • 简单直接,易于实现
  • 一旦 Token 泄露,任何人都可以冒充你
  • 需要定期轮换(更换)Token

在 AI API 中的应用:

  • Anthropic:Authorization: Bearer sk-ant-...
  • OpenAI:Authorization: Bearer sk-...

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?

  1. 简单:一个 Header 就搞定,不需要复杂的握手流程
  2. 快速:验证过程快,不影响 API 响应速度
  3. 灵活:可以随时生成/撤销 Token
  4. 标准:已经成为行业事实上的标准

请求头中的认证信息

完整的 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 UnauthorizedToken 无效或过期检查 Token 是否正确,是否已过期
403 ForbiddenToken 有效但没有权限检查账户权限,或联系服务商
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 数据结构基础 了解请求体中的认证数据结构

互链

链接来自概念卡正文里的双链,编译时能解到本期词条集的才成为站内链接。

反链(0)

还没有其它词条引用这一页。

出现在哪些课时里(0)

判据与「课时正文里能不能点出来」是同一个:那一节确实提到了它。点课时走当前页跳转, 它是导航,不是词条链接。

还没有课时讲到这一条。它是词条跑在课程前面的那一部分,不是错链。

关联图

只画这一条与它直接相连的词条,边与上面两区同源。可拖拽、可缩放,点节点是新标签。

出处

路径是本地知识库(Obsidian 库)里的位置,正文与概念卡逐字对应。

  • 概念卡原文API 认证基础03_RESOURCES/概念/api-认证基础.md
  • 所属知识地图栏目概念页索引 · API 与后端基础03_RESOURCES/概念/Index.md

编译入库:2026年11月2日。词条由知识库编译而来, 修正要回到概念卡改,再重新编译。