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

如何无需重复认证调用Gmail API?Access Token使用方案

在Gmail API调用中使用本地存储的Access Token

核心逻辑

所有Gmail API请求必须在请求头中携带OAuth2 Access Token,格式为Authorization: Bearer {你的Token},这是跳过重复授权的核心操作。


步骤1:从localStorage读取Token

先验证Token是否存在,不存在时再触发授权流程:

const accessToken = localStorage.getItem('gmail_access_token');
if (!accessToken) {
  // 此处编写你的OAuth2授权逻辑,比如跳转Google授权页面
  redirectToAuth();
}

步骤2:调用Gmail API的两种实用方式

方式一:原生Fetch API(通用无依赖)

无论获取邮件、添加标签还是其他操作,统一在请求头中携带Token:

  • 获取邮件列表示例:
async function getGmailMessages() {
  const accessToken = localStorage.getItem('gmail_access_token');
  try {
    const response = await fetch('https://gmail.googleapis.com/gmail/v1/users/me/messages', {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${accessToken}`,
        'Content-Type': 'application/json'
      }
    });
    if (!response.ok) {
      if (response.status === 401) {
        // Token过期,触发刷新或重新授权逻辑
        handleTokenExpiry();
        return;
      }
      throw new Error('API请求失败');
    }
    const data = await response.json();
    console.log('邮件列表:', data);
    return data;
  } catch (error) {
    console.error('请求错误:', error);
  }
}
  • 给指定邮件添加标签示例:
async function addLabelToMessage(messageId, labelIds) {
  const accessToken = localStorage.getItem('gmail_access_token');
  try {
    const response = await fetch(`https://gmail.googleapis.com/gmail/v1/users/me/messages/${messageId}/modify`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${accessToken}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        addLabelIds: labelIds // 示例:['STARRED', '自定义标签ID']
      })
    });
    if (!response.ok) {
      if (response.status === 401) {
        handleTokenExpiry();
        return;
      }
      throw new Error('添加标签失败');
    }
    const data = await response.json();
    console.log('标签添加成功:', data);
    return data;
  } catch (error) {
    console.error('操作错误:', error);
  }
}

方式二:Google官方API客户端库

如果使用gapi库,可直接设置已有的Token,无需重复初始化授权:

// 初始化gapi后,直接注入本地存储的Token
gapi.auth.setToken({ access_token: localStorage.getItem('gmail_access_token') });

// 调用获取邮件方法示例
async function getMessagesWithGapi() {
  try {
    const response = await gapi.client.gmail.users.messages.list({
      'userId': 'me',
      'maxResults': 10
    });
    console.log('邮件列表:', response.result);
    return response.result;
  } catch (error) {
    if (error.status === 401) {
      handleTokenExpiry();
    }
    console.error('请求错误:', error);
  }
}

关键注意事项

  • Token有效期处理:Access Token默认有效期为1小时,必须监听401 Unauthorized错误,此时需用Refresh Token刷新Access Token(若之前获取了Refresh Token),或引导用户重新授权。
  • 权限范围匹配:确保你的Token包含对应API调用所需的权限(比如读取邮件需https://www.googleapis.com/auth/gmail.readonly,修改标签需https://www.googleapis.com/auth/gmail.modify),权限不足会返回403错误。
  • 存储安全性:localStorage存在XSS攻击风险,生产环境建议配合HttpOnly Cookie或其他安全存储方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:45:49