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
}
|