如何在JavaScript中无需令牌或用长期令牌上传文件至Google Cloud Storage
解决Google Cloud Storage上传的两个方案
一、无需令牌实现文件上传(推荐用签名URL)
不推荐的公开写入方式(风险高)
- 打开Google Cloud控制台,找到你的存储桶
- 进入「权限」标签,添加成员
allUsers,授予Storage Object Creator角色 - 此时任何人都能直接调用上传接口(不用加Authorization头),但这种方式会让存储桶被恶意上传垃圾文件,产生额外费用和安全问题,强烈不建议用。
推荐的签名URL方式(安全可控)
签名URL能让指定用户在限定时间内上传,不用带OAuth令牌,权限也能管控:
- 后端生成签名URL(必须在后端做,因为要用到服务账号密钥,不能暴露在前端)
- 用Google Cloud SDK命令行生成:
gsutil signurl -d 1h -m POST gs://BUCKET_NAME/test.png 你的服务账号密钥路径.json - Node.js代码生成示例:
const {Storage} = require('@google-cloud/storage'); const storage = new Storage({keyFilename: '服务账号密钥.json'}); const bucket = storage.bucket('BUCKET_NAME'); const file = bucket.file('test.png'); const options = { version: 'v4', action: 'write', expires: Date.now() + 3600 * 1000, // 有效期设为1小时,可自行调整 contentType: 'image/png', }; const [url] = await file.getSignedUrl(options);
- 用Google Cloud SDK命令行生成:
- 前端拿到签名URL后,直接用POST上传,不用加Authorization头:
let response = await fetch(url, { method: "POST", headers: { "Content-Type": 'image/png', // 要和生成签名URL时指定的类型一致 }, body: file, });
二、获取有效期更长的令牌
OAuth Playground的令牌只有1小时有效期,要长期用可以选下面两种方式:
方式1:用服务账号生成令牌(最长12小时)
适合后端服务使用,步骤如下:
- 从Google Cloud控制台下载服务账号的密钥JSON文件
- 用代码生成令牌(Node.js示例):
const {GoogleAuth} = require('google-auth-library'); const auth = new GoogleAuth({ keyFilename: '服务账号密钥.json', scopes: ['https://www.googleapis.com/auth/devstorage.write_only'], }); const client = await auth.getClient(); const token = await client.getAccessToken(); // token.value就是有效期最长12小时的访问令牌
方式2:获取刷新令牌(长期有效)
如果是用户授权场景(比如用用户自己的Google账号上传),可以获取刷新令牌,用来反复生成新的访问令牌:
- 在Google Cloud控制台创建OAuth客户端ID,设置好授权回调地址
- 用户授权时,一定要请求
offline权限,这样授权后会返回刷新令牌 - 用刷新令牌获取新的访问令牌(示例代码):
const {OAuth2Client} = require('google-auth-library'); const client = new OAuth2Client(你的客户端ID, 你的客户端密钥, 回调地址); client.setCredentials({refresh_token: '你的刷新令牌'}); const {token} = await client.getAccessToken();
内容的提问来源于stack exchange,提问作者Ammar Kayali
相关产品推荐
相关产品推荐

