You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fetch在Node.js/Deno/Postman正常,Chrome控制台报Unauthorized问题咨询

问题分析:浏览器Fetch与Node.js/Deno Fetch的差异导致Unauthorized错误

Node.js和Deno的Fetch实现确实会和浏览器Fetch存在默认行为差异,其中部分自动注入的请求头或缺失的头信息,可能是导致你遇到Unauthorized错误的核心原因:

1. 默认请求头的关键差异

  • User-Agent 头:浏览器Fetch会自动携带当前浏览器的专属User-Agent(例如Chrome的Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...),而Node.js/Deno的Fetch默认使用自身标识(比如Node.js的node-fetch/2.6.1、Deno的Deno/1.37.0)。很多服务会校验User-Agent字段,浏览器的UA可能不被目标服务的验证逻辑认可,而Node/Deno的UA刚好符合要求。
  • Origin/Referer 头:浏览器环境下,Fetch会自动添加Origin和Referer头(即使禁用了网页安全,部分浏览器的默认行为仍会保留),而Node.js/Deno的Fetch默认不会携带这两个头。目标服务可能因为浏览器发送了这两个头,触发了跨域或其他校验规则导致Unauthorized;而Node/Deno因为没带这些头,反而通过了验证。
  • Cookie 处理:浏览器对Cookie的处理受同源策略等安全机制约束(即使禁用网页安全,可能仍有内部校验逻辑),比如对Cookie的格式、属性的检查更严格;而Node.js/Deno只是将你设置的Cookie头原样发送,没有额外限制。

2. 验证与解决方法

你可以手动调整浏览器Fetch的请求头,模拟Node.js/Deno的行为来排查问题:

const profileId = 'foo';
const sessionId = 'bar';

getRelativesMetaData(profileId, sessionId).then(console.log);

async function getRelativesMetaData(myProfileId, sessionId) {
  const headers = new Headers({
    'x-requested-with': 'XMLHttpRequest',
    'Cookie': `current-profile-id=${myProfileId}; sessionid=${sessionId}`,
    'User-Agent': 'node-fetch/2.6.1' // 模拟Node.js的User-Agent
  });
  // 尝试删除浏览器自动添加的Origin和Referer头
  headers.delete('Origin');
  headers.delete('Referer');

  const url = `https://you.23andme.com/p/${myProfileId}/family/relatives/ajax/`;
  const resp = await fetch(url, { headers });
  const json = await resp.json();
  return json;
}

另外,建议分别在浏览器开发者工具(Network面板查看Request Headers)、Node.js/Deno的控制台打印请求的实际发送头,对比找出差异字段,针对性调整即可。

内容的提问来源于stack exchange,提问作者GirkovArpa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:09:16