【发布时间】:2021-07-15 09:32:27
【问题描述】:
我正在尝试列出在我的组织内创建的所有共享驱动器中的所有文件。虽然,当我尝试获取特定驱动器的文件时,我得到:
Error 403: The attempted action requires shared drive membership., teamDriveMembershipRequired
这是有道理的,因为我的用户不属于那个共享驱动器。我可以冒充一个拥有者的用户,并且我认为这会起作用,尽管Drives List(我用来获取共享驱动器列表的 API)没有提供有关共享驱动器所有者的详细信息。
如果我冒充管理员用户或使用服务帐户获取 DriveId,我会收到相同的 403 错误。
package main
imports ...
func main() {
d := drive.New(drive.Service{
Ctx: ctx,
User: nil,
Query: "",
Limiter: &driveQuota,
})
driveList := d.GetDrivesList()
for _, sharedDrive := range driveList.Drives {
files := d.GetSharedDriveFiles(sharedDrive.Id)
for _, f := range files {
j, _ := f.MarshalJSON()
logrus.Println(string(j))
}
}
}
package drive
imports ...
func New(options Service) Service {
var c *http.Client
if options.User != nil {
c = client.New(options.Ctx, options.User.PrimaryEmail, drive.DriveScope)
} else {
apiUser := os.Getenv("API_USER")
c = client.New(options.Ctx, apiUser, drive.DriveScope)
}
srv, err := drive.NewService(options.Ctx, option.WithHTTPClient(c))
errorchecker.Check(err, "Unable to create Drive service")
return Service{srv, options.Ctx, options.User, options.Query, options.Limiter}
}
func (d *Service) GetDrivesList() *drive.DriveList {
srv := d.service
driveList, err := srv.Drives.List().UseDomainAdminAccess(true).Do()
errorchecker.Check(err, "Unable to get Drives list")
return driveList
}
func (d *Service) GetSharedDriveFiles(id string) []*drive.File {
srv := d.service
var sharedDriveFiles []*drive.File
listFiles := func(r *drive.FileList) error {
sharedDriveFiles = append(sharedDriveFiles, r.Files...)
return nil
}
err := srv.Files.List().Corpora("drive").DriveId(id).SupportsAllDrives(true).IncludeItemsFromAllDrives(true).Fields("files(id,ownedByMe,permissions,shared,sharingUser,trashed,properties,appProperties,name)").PageSize(1000).Pages(d.Ctx, listFiles)
errorchecker.Check(err, "Unable to get Shared Drive files")
return sharedDriveFiles
}
package client
imports ...
func New(ctx context.Context, subject interface{}, scope ...string) *http.Client {
cert := os.Getenv("CERT")
b, err := ioutil.ReadFile(cert)
errorchecker.Check(err, "Unable to read secret file")
config, err := google.JWTConfigFromJSON(b, scope...)
errorchecker.Check(err, "Unable to parse utils secret file to config")
if subject != nil {
config.Subject = subject.(string)
}
return config.Client(ctx)
}
【问题讨论】:
-
如果我冒充管理员用户或使用服务帐户获取 DriveId,我会收到相同的 403 错误。请提供您的授权码
-
我省略了一些不相关的代码部分。让我知道这是否足够。
-
您模拟的用户能否在浏览器中打开驱动器?
-
是的,可以。我也将同一用户用于其他任务。
标签: go google-cloud-platform google-drive-api google-admin-sdk