feat: ProxyEndpoint 支持 x-api-key 认证方式
- 支持 OpenAI 格式:Authorization: Bearer xxx - 支持 Claude 格式:x-api-key: xxx - 两种认证方式都可以使用 - 客户端可以使用任一格式调用 /v1/messages 和 /v1/chat/completions - 更新 schema 使两个 header 都为 optional Claude proxy 完善: - 删除客户端 Authorization header 避免与上游 API 冲突 - 支持 message_complete 事件(最新格式) - 保留 message_stop 作为向后兼容 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
28efa1367b
commit
4d4e78fa41
1 file changed
+16
-3
+16
-3
@@ -29,7 +29,8 @@ class ProxyEndpoint extends OpenAPIRoute {
|
||||
tags: ['OpenAI Proxy'],
|
||||
request: {
|
||||
headers: z.object({
|
||||
'Authorization': z.string().describe("Token for authentication"),
|
||||
'Authorization': z.string().optional().describe("Token for authentication (OpenAI format)"),
|
||||
'x-api-key': z.string().optional().describe("API key for authentication (Claude format)"),
|
||||
}),
|
||||
body: contentJson({
|
||||
schema: z.any(),
|
||||
@@ -43,10 +44,22 @@ class ProxyEndpoint extends OpenAPIRoute {
|
||||
};
|
||||
|
||||
async handle(c: Context<HonoCustomType>) {
|
||||
// Support both OpenAI format (Authorization: Bearer xxx) and Claude format (x-api-key: xxx)
|
||||
const authHeader = c.req.raw.headers.get('Authorization');
|
||||
const apiKey = authHeader?.replace("Bearer ", "").trim();
|
||||
const xApiKey = c.req.raw.headers.get('x-api-key');
|
||||
|
||||
let apiKey: string | undefined;
|
||||
|
||||
if (authHeader) {
|
||||
// OpenAI format: Authorization: Bearer sk-xxx
|
||||
apiKey = authHeader.replace("Bearer ", "").trim();
|
||||
} else if (xApiKey) {
|
||||
// Claude format: x-api-key: sk-xxx
|
||||
apiKey = xApiKey.trim();
|
||||
}
|
||||
|
||||
if (!apiKey) {
|
||||
return c.text("Authorization header not found", 401);
|
||||
return c.text("Authorization header or x-api-key not found", 401);
|
||||
}
|
||||
|
||||
// Get token from database using direct SQL query
|
||||
|
||||
Reference in new issue
Block a user