使用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
相关产品推荐
相关产品推荐

