mirror of
https://gitee.com/wanwujie/sub2api
synced 2026-04-03 06:52:13 +08:00
根因:多个用户共享同一 OAuth 账号时,conversation_id/session_id 头 未做用户隔离,导致上游 chatgpt.com 将不同用户的请求关联到同一会话。 HTTP SSE 修复: - 新增 isolateOpenAISessionID(apiKeyID, raw),将 API Key ID 混入 session 标识符(xxhash),确保不同 Key 的用户产生不同上游会话 - buildUpstreamRequest: OAuth 分支先 Del 客户端透传的 session 头, 再用隔离值覆盖 - buildUpstreamRequestOpenAIPassthrough: 透传路径同样隔离 - ForwardAsAnthropic: Anthropic Messages 兼容路径同步修复 - buildOpenAIWSHeaders: WS 路径的 OAuth session 头同步隔离
51 lines
1.5 KiB
Go
51 lines
1.5 KiB
Go
package service
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestIsolateOpenAISessionID(t *testing.T) {
|
|
t.Run("empty_raw_returns_empty", func(t *testing.T) {
|
|
assert.Equal(t, "", isolateOpenAISessionID(1, ""))
|
|
assert.Equal(t, "", isolateOpenAISessionID(1, " "))
|
|
})
|
|
|
|
t.Run("deterministic", func(t *testing.T) {
|
|
a := isolateOpenAISessionID(42, "sess_abc123")
|
|
b := isolateOpenAISessionID(42, "sess_abc123")
|
|
assert.Equal(t, a, b)
|
|
})
|
|
|
|
t.Run("different_apiKeyID_different_result", func(t *testing.T) {
|
|
a := isolateOpenAISessionID(1, "same_session")
|
|
b := isolateOpenAISessionID(2, "same_session")
|
|
require.NotEqual(t, a, b, "不同 API Key 使用相同 session_id 应产生不同隔离值")
|
|
})
|
|
|
|
t.Run("different_raw_different_result", func(t *testing.T) {
|
|
a := isolateOpenAISessionID(1, "session_a")
|
|
b := isolateOpenAISessionID(1, "session_b")
|
|
require.NotEqual(t, a, b)
|
|
})
|
|
|
|
t.Run("format_is_16_hex_chars", func(t *testing.T) {
|
|
result := isolateOpenAISessionID(99, "test_session")
|
|
assert.Len(t, result, 16, "应为 16 字符的 hex 字符串")
|
|
for _, ch := range result {
|
|
assert.True(t, (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f'),
|
|
"应仅包含 hex 字符: %c", ch)
|
|
}
|
|
})
|
|
|
|
t.Run("zero_apiKeyID_still_works", func(t *testing.T) {
|
|
result := isolateOpenAISessionID(0, "session")
|
|
assert.NotEmpty(t, result)
|
|
// apiKeyID=0 与 apiKeyID=1 应产生不同结果
|
|
other := isolateOpenAISessionID(1, "session")
|
|
assert.NotEqual(t, result, other)
|
|
})
|
|
}
|