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

如何在React Native中无需用户交互获取Google Sheet API的ACCESS_TOKEN

实现方案说明

仅用fetch完全可以获取所需Access Token,不需要引入任何第三方依赖。你要求无弹窗自动处理的场景,需要使用Google Cloud的服务账号鉴权方案,而非面向普通用户的OAuth授权码流程,整个流程完全在代码层完成,不会触发任何账号选择弹窗。

前置准备操作(仅需在Google Cloud后台完成一次)

  • 打开Google Cloud控制台,新建或选择已有项目,启用Google Sheets API
  • 进入「服务账号」页面,创建一个新的服务账号,创建完成后下载对应的JSON密钥文件,文件内包含client_email、private_key两个核心字段
  • 打开你要操作的私有Google表格,点击「共享」,把刚才服务账号的client_email邮箱地址添加为表格的编辑者(仅需读取的话添加为查看者即可),保存共享设置

具体实现步骤(React Native端纯fetch实现)

步骤1:生成JWT(JSON Web Token)

Google服务账号鉴权需要先自行生成JWT,再用JWT交换Access Token,JWT生成完全可以手写实现,无需第三方包:
JWT由三部分内容用.拼接而成,格式为[Base64Url编码的Header].[Base64Url编码的Payload].[Base64Url编码的签名]
各部分生成要求:

  • Header为固定JSON结构:{"alg":"RS256","typ":"JWT"},转成字符串后做Base64Url编码
  • Payload的JSON结构如下:
{
  "iss": "你的服务账号client_email字段值",
  "scope": "https://www.googleapis.com/auth/spreadsheets",
  "aud": "https://oauth2.googleapis.com/token",
  "exp":  Math.floor(Date.now() / 1000) + 3600, // 过期时间,最长可设为1小时
  "iat":  Math.floor(Date.now() / 1000) // 签发时间
}

转成字符串后做Base64Url编码

  • 签名部分:将前两部分编码后的内容用.拼接,用服务账号的private_key做RS256签名,再把签名结果做Base64Url编码

提示:React Native环境可以直接用btoa()做Base64编码,Base64Url编码仅需要把普通Base64结果中的+替换为-、/替换为_、去掉末尾的=即可;RS256签名可以用React Native内置的crypto模块实现,无需额外依赖

步骤2:用JWT交换Access Token

直接调用Google的OAuth token接口,用fetch发送POST请求即可:

const getAccessToken = async (jwt) => {
  const res = await fetch('https://oauth2.googleapis.com/token', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: `grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=${jwt}`
  })
  const data = await res.json()
  // 返回的data.access_token就是所需访问令牌,有效期1小时,可以缓存起来过期再重新换取
  return data.access_token
}

步骤3:调用Sheets API读写数据

拿到token后,请求目标接口时在请求头携带Authorization字段即可:

// 读数据示例
const readSheetData = async (accessToken, spreadsheetId, range) => {
  const res = await fetch(`https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}/values/${range}`, {
    headers: {
      'Authorization': `Bearer ${accessToken}`
    }
  })
  return await res.json()
}

注意事项

  • 不要把服务账号的私钥硬编码在前端生产代码中,如果是商用应用建议把鉴权逻辑放到自己的后端服务,前端调用自有后端接口获取token,避免私钥泄露导致表格数据被篡改
  • Access Token有效期为1小时,无需每次请求都重新生成,缓存起来过期后再重新换取即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:54:02