如何在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
相关产品推荐
相关产品推荐

