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

JavaScript fetch中如何存储access token并传递给后续API请求

最优实现方案

方案前提

第二个请求完全依赖第一个接口返回的access_token,必须保证第一个接口请求成功拿到token后再发起第二个请求。

场景1:仅当前页面会话临时使用(刷新后token不需要留存)

直接用变量存储token即可,推荐用async/await语法简化异步流程,比传统链式then可读性和可维护性更高:

// 封装获取token的方法
async function getAccessToken() {
  const inputBody = 'client_id=00000000-0000-0000-0000-000000000001&secret=mySecretPassword';
  const headers = {
    'Content-Type':'application/x-www-form-urlencoded',
  };
  const res = await fetch('https://api.replicastudios.com/auth', {
    method: 'POST',
    body: inputBody,
    headers: headers
  });
  const body = await res.json();
  // 假设接口返回的token字段是access_token,根据实际返回字段调整
  return body.access_token;
}

// 封装获取voice列表的方法
async function getVoiceList(token) {
  const headers = {
    'Authorization':`Bearer ${token}`
  };
  const res = await fetch('https://api.replicastudios.com/voice', {
    method: 'GET',
    headers: headers
  });
  return await res.json();
}

// 按顺序执行请求
async function main() {
  try {
    const token = await getAccessToken();
    const voiceData = await getVoiceList(token);
    console.log(voiceData);
  } catch (err) {
    // 统一处理错误,比如token获取失败、接口请求失败等
    console.error('请求出错:', err);
  }
}

main();

场景2:需要持久化存储token(刷新页面/重启浏览器后可复用,避免重复请求token)

如果token有固定有效期,不需要每次都重新申请,可以把token存在sessionStorage(仅当前标签页生效)或者localStorage(当前域名下永久生效,除非手动清除)里:

async function getValidToken() {
  // 先从本地存储取已有的token
  const savedToken = localStorage.getItem('replica_access_token');
  if (savedToken) {
    // 如果你能拿到token的过期时间,可以在这里加过期判断,过期了就重新请求
    return savedToken;
  }
  // 没有有效token就重新请求
  const inputBody = 'client_id=00000000-0000-0000-0000-000000000001&secret=mySecretPassword';
  const headers = {
    'Content-Type':'application/x-www-form-urlencoded',
  };
  const res = await fetch('https://api.replicastudios.com/auth', {
    method: 'POST',
    body: inputBody,
    headers: headers
  });
  const body = await res.json();
  const newToken = body.access_token;
  // 存到本地存储
  localStorage.setItem('replica_access_token', newToken);
  // 如果有过期时间可以同时存下来
  // localStorage.setItem('replica_token_expire', body.expire_at);
  return newToken;
}

async function main() {
  try {
    const token = await getValidToken();
    // 后续发起第二个请求逻辑和上面场景一致
    const headers = {
      'Authorization':`Bearer ${token}`
    };
    const res = await fetch('https://api.replicastudios.com/voice', {
      method: 'GET',
      headers: headers
    });
    const voiceData = await res.json();
    console.log(voiceData);
  } catch (err) {
    console.error('请求出错:', err);
  }
}

main();

注意事项

  • 安全性要求高的场景不建议把token存在localStorage中,避免XSS攻击导致token泄露,优先用临时变量存储
  • 实际使用中要增加对接口返回值的校验,判断token是否正常返回,避免后续请求传空值
  • 如果接口返回的token有过期时间,一定要加过期判断逻辑,避免传失效token请求接口报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:36:03