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

如何在JavaScript中无需令牌或用长期令牌上传文件至Google Cloud Storage

解决Google Cloud Storage上传的两个方案

一、无需令牌实现文件上传(推荐用签名URL)

不推荐的公开写入方式(风险高)

  • 打开Google Cloud控制台,找到你的存储桶
  • 进入「权限」标签,添加成员allUsers,授予Storage Object Creator角色
  • 此时任何人都能直接调用上传接口(不用加Authorization头),但这种方式会让存储桶被恶意上传垃圾文件,产生额外费用和安全问题,强烈不建议用。

推荐的签名URL方式(安全可控)

签名URL能让指定用户在限定时间内上传,不用带OAuth令牌,权限也能管控:

  1. 后端生成签名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);
      
  2. 前端拿到签名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账号上传),可以获取刷新令牌,用来反复生成新的访问令牌:

  1. 在Google Cloud控制台创建OAuth客户端ID,设置好授权回调地址
  2. 用户授权时,一定要请求offline权限,这样授权后会返回刷新令牌
  3. 用刷新令牌获取新的访问令牌(示例代码):
    const {OAuth2Client} = require('google-auth-library');
    const client = new OAuth2Client(你的客户端ID, 你的客户端密钥, 回调地址);
    client.setCredentials({refresh_token: '你的刷新令牌'});
    const {token} = await client.getAccessToken();
    

内容的提问来源于stack exchange,提问作者Ammar Kayali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:35:13