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

使用Golang与ServiceAccount向GoogleDrive传文件共享时遇403错误求助

借助Golang服务账号上传文件到Google Drive时遭遇403错误的解决办法

我尝试用Golang通过服务账号(ServiceAccount)将文件上传至Google Drive,并设置为所有人可访问,但执行时碰到403错误。

代码示例

package main

import (
    "fmt"
    "golang.org/x/net/context"
    "google.golang.org/api/drive/v3"
    "google.golang.org/api/googleapi"
    "google.golang.org/api/option"
    "log"
    "os"
)

func main() {
    srv, err := drive.NewService(context.Background(), option.WithCredentialsFile("key.json"))
    if err != nil {
        log.Fatal("Unable to access Drive API:", err)
    }

    filename := "./lemon.txt"
    file, err := os.Open(filename)
    if err != nil {
        log.Fatalln(err)
    }

    stat, err := file.Stat()
    if err != nil {
        log.Fatalln(err)
    }
    defer file.Close()

    res, err := srv.Files.Create(
        &drive.File{
            Parents: []string{"17n-EpJcGg0DmmWqSoJ75iIUdXDP7neoH"},
            Name:    "banana.txt",
            Permissions: []*drive.Permission{
                {
                    Role: "reader",
                    Type: "anyone",
                },
            },
        },
    ).Media(file, googleapi.ChunkSize(int(stat.Size()))).Do()
    if err != nil {
        log.Fatalln(err)
    }
    
    fmt.Printf("%s\n", res.Id)
}

错误信息

403 Forbidden
Request had insufficient authentication scopes.

解决办法

  • 补充API权限范围
    403错误核心原因是权限范围不足,创建Drive服务时需要指定合适的scope。可选择以下两种常用scope:

    • drive.DriveScope:完整的Google Drive操作权限,适合服务账号场景
    • drive.DriveFileScope:仅对服务账号创建的文件拥有操作权限,权限更严格
      修改服务初始化代码,添加scope参数:
    srv, err := drive.NewService(context.Background(),
        option.WithCredentialsFile("key.json"),
        option.WithScopes(drive.DriveScope),
    )
    
  • 确保服务账号能访问目标文件夹
    找到key.json中的client_email字段(服务账号邮箱),给目标文件夹17n-EpJcGg0DmmWqSoJ75iIUdXDP7neoH添加该邮箱的编辑权限,否则服务账号无法向该文件夹上传文件。

  • 拆分文件上传与权限设置步骤
    不建议在文件创建时直接附带权限设置,容易触发权限验证问题。建议先完成文件上传,再单独调用权限接口设置公开访问:

    // 上传文件
    res, err := srv.Files.Create(
        &drive.File{
            Parents: []string{"17n-EpJcGg0DmmWqSoJ75iIUdXDP7neoH"},
            Name:    "banana.txt",
        },
    ).Media(file, googleapi.ChunkSize(int(stat.Size()))).Do()
    if err != nil {
        log.Fatalln(err)
    }
    
    // 设置所有人可访问权限
    _, err = srv.Permissions.Create(res.Id, &drive.Permission{
        Role: "reader",
        Type: "anyone",
    }).Do()
    if err != nil {
        log.Fatalln(err)
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:25:19