File size: 2,422 Bytes
69b897d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
const logger = require('../utils/logger')

/**
 * 浏览器/Chrome插件兜底中间件
 * 专门处理第三方插件的兼容性问题
 */
const browserFallbackMiddleware = (req, res, next) => {
  const userAgent = req.headers['user-agent'] || ''
  const origin = req.headers['origin'] || ''

  const extractHeader = (value) => {
    let candidate = value

    if (Array.isArray(candidate)) {
      candidate = candidate.find((item) => typeof item === 'string' && item.trim())
    }

    if (typeof candidate !== 'string') {
      return ''
    }

    let trimmed = candidate.trim()
    if (!trimmed) {
      return ''
    }

    if (/^Bearer\s+/i.test(trimmed)) {
      trimmed = trimmed.replace(/^Bearer\s+/i, '').trim()
    }

    return trimmed
  }

  const apiKeyHeader =
    extractHeader(req.headers['x-api-key']) || extractHeader(req.headers['x-goog-api-key'])
  const normalizedKey = extractHeader(req.headers['authorization']) || apiKeyHeader

  // 检查是否为Chrome插件或浏览器请求
  const isChromeExtension = origin.startsWith('chrome-extension://')
  const isBrowserRequest = userAgent.includes('Mozilla/') && userAgent.includes('Chrome/')
  const hasApiKey = normalizedKey.startsWith('cr_') // 我们的API Key格式

  if ((isChromeExtension || isBrowserRequest) && hasApiKey) {
    // 为Chrome插件请求添加特殊标记
    req.isBrowserFallback = true
    req.originalUserAgent = userAgent

    // 🆕 关键修改:伪装成claude-cli请求以绕过客户端限制
    req.headers['user-agent'] = 'claude-cli/1.0.110 (external, cli, browser-fallback)'

    // 确保设置正确的认证头
    if (!req.headers['authorization'] && apiKeyHeader) {
      req.headers['authorization'] = `Bearer ${apiKeyHeader}`
    }

    // 添加必要的Anthropic头
    if (!req.headers['anthropic-version']) {
      req.headers['anthropic-version'] = '2023-06-01'
    }

    if (!req.headers['anthropic-dangerous-direct-browser-access']) {
      req.headers['anthropic-dangerous-direct-browser-access'] = 'true'
    }

    logger.api(
      `🔧 Browser fallback activated for ${isChromeExtension ? 'Chrome extension' : 'browser'} request`
    )
    logger.api(`   Original User-Agent: "${req.originalUserAgent}"`)
    logger.api(`   Origin: "${origin}"`)
    logger.api(`   Modified User-Agent: "${req.headers['user-agent']}"`)
  }

  next()
}

module.exports = {
  browserFallbackMiddleware
}