带有服务帐户的 Google Apps API 403

Nat*_*and 3 go google-apps google-oauth service-accounts google-admin-sdk

我一直在尝试对 Google 的 Admin API 进行查询,以列出我的 Google Apps 组织中的所有用户。我有权在Web UI 示例中进行此查询并获取结果,但当我尝试使用服务帐户进行查询时,会出现 403 错误。

import (
    "fmt"
    "io/ioutil"
    "log"

    "golang.org/x/net/context"
    "golang.org/x/oauth2/google"
    directory "google.golang.org/api/admin/directory_v1"
)

func main() {
    serviceAccountJSON, err := ioutil.ReadFile(serviceAccountFile)
    if err != nil {
        log.Fatalf("Could not read service account credentials file, %s => {%s}", serviceAccountFile, err)
    }
    config, err := google.JWTConfigFromJSON(serviceAccountJSON,
        directory.AdminDirectoryUserScope,
        directory.AdminDirectoryUserReadonlyScope,
    )

    client, err := directory.New(config.Client(context.Background()))
    if err != nil {
        log.Fatalf("Could not create directory service client => {%s}", err)
    }

    users, err := client.Users.List().ViewType(publicDataView).Domain(domain).Do()
    if err != nil {
        log.Fatalf("Failed to query all users => {%s}", err)
    }

    for _, u := range users.Users {
        fmt.Println(u.Name.FullName)
    }
}
Run Code Online (Sandbox Code Playgroud)

每次执行时都会收到 403 错误。相同的查询参数在此处Try it!起作用,因此我不确定为什么会失败。

结果:Failed to query all users => {googleapi: Error 403: Not Authorized to access this resource/api, forbidden}

Chr*_*jam 6

我知道这个问题已经有一年了,但我在任何地方都找不到任何有关此问题的信息 - 但我在遇到与您相同的错误后刚刚设法修复它。

基本上你需要为你的配置设置一个委托用户,例如:

func main() {
    serviceAccountJSON, err := ioutil.ReadFile(serviceAccountFile)
    if err != nil {
        log.Fatalf("Could not read service account credentials file, %s => {%s}", serviceAccountFile, err)
    }
    config, err := google.JWTConfigFromJSON(serviceAccountJSON,
        directory.AdminDirectoryUserScope,
        directory.AdminDirectoryUserReadonlyScope,
    )

    // Add me
    config.Subject = "someone@example.com"

    client, err := directory.New(config.Client(context.Background()))
    if err != nil {
        log.Fatalf("Could not create directory service client => {%s}", err)
    }

    users, err := client.Users.List().ViewType(publicDataView).Domain(domain).Do()
    if err != nil {
        log.Fatalf("Failed to query all users => {%s}", err)
    }

    for _, u := range users.Users {
        fmt.Println(u.Name.FullName)
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅https://github.com/golang/oauth2/blob/master/google/example_test.go#L118

希望这对其他人有帮助!