Skip to content

Commit 130dd02

Browse files
Merge pull request #1 from gloryhry/main
feat: 添加可选身份认证支持,验证 Bearer Token
2 parents 1366819 + feafad7 commit 130dd02

2 files changed

Lines changed: 61 additions & 6 deletions

File tree

README.md

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
- **完全兼容 OpenAI API**: 支持标准的 `/v1/models``/v1/chat/completions` 端点
1616
- **流式响应**: 通过 Server-Sent Events (SSE) 实时返回增量聊天内容
1717
- **非流式响应**: 等待完整响应后一次性返回 JSON 格式的最终结果
18+
- **可选身份认证**: 支持 Bearer Token 认证保护 API 端点
1819
- **无需外部依赖**: 使用 Deno 原生 WebSocket 实现 Socket.IO 协议
1920

2021
## 快速开始
@@ -33,6 +34,25 @@ deno task dev
3334

3435
服务器将在 `http://localhost:8000` 上启动。
3536

37+
#### 可选:启用身份认证
38+
39+
如需启用 API 身份认证,设置环境变量 `USER_SET_KEY`
40+
41+
```bash
42+
# Linux/macOS
43+
export USER_SET_KEY="your-secret-key"
44+
deno task dev
45+
46+
# Windows (PowerShell)
47+
$env:USER_SET_KEY="your-secret-key"
48+
deno task dev
49+
```
50+
51+
启用后,所有 `/v1/chat/completions` 请求需要在 Header 中携带:
52+
```
53+
Authorization: Bearer your-secret-key
54+
```
55+
3656
### Deno Deploy 部署
3757

3858
本项目可以直接部署到 Deno Deploy,无需服务器维护。
@@ -54,7 +74,9 @@ deno task dev
5474

5575
3. **配置部署设置**
5676
- **入口点**: 选择 `deploy.ts`
57-
- **环境变量**: 无需额外配置(所有配置已在代码中)
77+
- **环境变量**(可选):
78+
- 如需启用身份认证,添加 `USER_SET_KEY` 环境变量
79+
- 不设置则跳过认证
5880
- 点击 "Deploy" 开始部署
5981

6082
4. **获取部署 URL**
@@ -138,6 +160,23 @@ curl -X POST http://localhost:8000/v1/chat/completions \
138160
}'
139161
```
140162

163+
### 带身份认证的请求
164+
165+
如果启用了 `USER_SET_KEY` 环境变量,需要添加 Authorization header:
166+
167+
```bash
168+
curl -X POST http://localhost:8000/v1/chat/completions \
169+
-H "Content-Type: application/json" \
170+
-H "Authorization: Bearer your-secret-key" \
171+
-d '{
172+
"model": "gpt-5",
173+
"messages": [
174+
{"role": "user", "content": "Hello!"}
175+
],
176+
"stream": false
177+
}'
178+
```
179+
141180
### 流式聊天完成
142181

143182
```bash
@@ -163,11 +202,12 @@ curl -N -X POST http://localhost:8000/v1/chat/completions \
163202

164203
## 工作原理
165204

166-
1. **认证**: 获取 LangFast 的匿名访问令牌
167-
2. **创建 Prompt**: 在 LangFast 中创建一个 prompt 并获取其 ID
168-
3. **启动运行**: 启动 prompt 运行并获取任务 ID
169-
4. **WebSocket 连接**: 通过 WebSocket 连接接收流式响应
170-
5. **格式转换**: 将响应转换为 OpenAI 兼容的格式
205+
1. **身份认证(可选)**: 验证请求的 Bearer Token(如果设置了 `USER_SET_KEY`
206+
2. **LangFast 认证**: 获取 LangFast 的匿名访问令牌
207+
3. **创建 Prompt**: 在 LangFast 中创建一个 prompt 并获取其 ID
208+
4. **启动运行**: 启动 prompt 运行并获取任务 ID
209+
5. **WebSocket 连接**: 通过 WebSocket 连接接收流式响应
210+
6. **格式转换**: 将响应转换为 OpenAI 兼容的格式
171211

172212
## 开发
173213

main.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,21 @@ export async function handler(req: Request): Promise<Response> {
123123
}
124124

125125
if (pathname === "/v1/chat/completions" && req.method === "POST") {
126+
const userSetKey = Deno.env.get("USER_SET_KEY");
127+
128+
if (userSetKey) {
129+
const authHeader = req.headers.get("Authorization");
130+
131+
if (!authHeader) {
132+
return json({ error: "Missing Authorization header" }, { status: 401 });
133+
}
134+
135+
const expectedAuth = `Bearer ${userSetKey}`;
136+
if (authHeader !== expectedAuth) {
137+
return json({ error: "Invalid authorization token" }, { status: 401 });
138+
}
139+
}
140+
126141
return handleChatCompletions(req);
127142
}
128143

0 commit comments

Comments
 (0)