豆包AI网页版接口未开放CORS,前端直连必被服务端拦截,必须通过自建代理服务(如Nginx或Flask)携带ARK_API_KEY或飞书token转发请求,前端仅与同源网关通信。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

前端直接调用豆包AI接口时浏览器报错“No 'Access-Control-Allow-Origin' header is present”或403/401,本质不是跨域配置能解决的问题——豆包AI网页版接口未开放CORS,所有前端直连请求都会被服务端主动拦截,无论你如何设置Access-Control-Allow-Origin头。
为什么前端不能直连豆包AI接口
豆包AI(doubao.com)的/api/v1/chat等路径强制校验X-Device-ID、X-Session-ID、Cookie和Referer,并依赖页面级WebSocket维持会话状态。你在Chrome插件content script里写fetch('https://www.doubao.com/api/v1/chat'),请求发出去就立刻返回403 Forbidden,这不是浏览器拦的,是豆包后端服务根据凭证缺失直接拒绝的。
【关键前提】 豆包AI没有公开Web API,也不提供官方SDK或CORS白名单地址。所谓“配置CORS”仅适用于你自建的后端网关,对豆包原生接口无效。
正确路径:必须走服务端代理
所有可行方案都绕不开一个核心动作:在你自己的服务器上部署一层反向代理,由它携带合法凭证(如ARK_API_KEY或飞书tenant_access_token)向豆包真实接口发起请求,前端只与你的同源网关通信。
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
第一步:确认你使用的接入通道
当前稳定可用的通道只有两种——火山引擎Ark平台API、飞书开放平台AI助手接口。其他方式(如抓网页Cookie、本地proxy)已失效或存在风控封禁风险。
第二步:选择任一通道获取凭证
① 火山引擎Ark:登录volcengine.com → 开通ARK模型服务 → 创建ARK_API_KEY → 记录Endpoint ID(如ep-xxxxx)
② 飞书平台:admin.feishu.cn → 开通豆包AI企业应用 → 获取app_id/app_secret → 换取tenant_access_token
第三步:部署代理服务
用Nginx或Node.js搭建转发层,例如Nginx配置中添加:
location /api/doubao/ {
proxy_pass https://ark.cn-beijing.volces.com/api/v3/chat/completions;
proxy_set_header Authorization "Bearer $ark_api_key";
proxy_set_header Content-Type "application/json";
}
代理服务的CORS配置要点
方法一:Flask后端启用flask-cors扩展(推荐)
安装:pip install flask-cors
代码中加入:from flask_cors import CORS;CORS(app, origins=["http://localhost:8080"], supports_credentials=True)
方法二:Nginx直接加响应头(无需改后端代码)
在location块内添加:
add_header 'Access-Control-Allow-Origin' 'http://localhost:8080';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type, X-API-Key';
add_header 'Access-Control-Allow-Credentials' 'true';
【易错点】 如果前端设置了withCredentials: true,Access-Control-Allow-Origin就不能写*,必须指定确切域名,否则浏览器仍会拦截。
前端调用示例(axios)
const response = await axios.post('/api/doubao', {
model: 'ep-xxxxxxxx',
messages: [{role: 'user', content: '你好'}]
}, {
baseURL: 'http://your-domain.com',
withCredentials: true
});
这一步操作起来很简单,直接把请求地址改成你自己的网关路径就行。注意payload结构必须严格匹配所选通道的规范——火山引擎用OpenAI兼容格式,飞书用{user_id, text}结构,混用会导致400错误。



















