Я получил это работает.Кажется, что это может быть сочетание вещей.DazWilkin, да, я получаю 401 несанкционированную ошибку, когда я переключаюсь, как я передаю в моей учетной записи службы.Я внес следующие изменения:
- Использовал тему вместо электронной почты в конфигурации.
- Использовал только область AdminDirectoryUserScope вместо области AdminDirectoryUserReadonlyScope (или их комбинации).
- Включен домен в запросе.Я получил 400 неверных запросов без него.
- Я подтвердил, что API-интерфейсы Справочника были включены по этой ссылке: https://developers.google.com/admin-sdk/directory/v1/quickstart/go.Когда я нажал на эту ссылку, он сказал, что API уже работает.Я использую те же учетные данные json, что и в некоторых производственных скриптах, написанных на других языках.То есть я думал, что это уже на месте.Так что я не думаю, что мне нужно было делать этот шаг, но я включу его, если он будет полезен для других.
Вот как теперь выглядит мой скрипт:
package main
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() {
serviceAccountFile := "/credentials.json"
serviceAccountJSON, err := ioutil.ReadFile(serviceAccountFile)
if err != nil {
log.Fatalf("Could not read service account credentials file, %s => {%s}", serviceAccountFile, err)
}
// I want to use these options, but these cause a 401 unauthorized error
// config, err := google.JWTConfigFromJSON(serviceAccountJSON,
// directory.AdminDirectoryUserScope,
// directory.AdminDirectoryUserReadonlyScope,
// )
config, err := google.JWTConfigFromJSON(serviceAccountJSON,
directory.AdminDirectoryUserScope,
)
// Add the service account.
//config.Email = "serviceaccount@domain.com" // Don't use Email, use Subject.
config.Subject = "serviceaccount@domain.com"
srv, err := directory.New(config.Client(context.Background()))
if err != nil {
log.Fatalf("Could not create directory service client => {%s}", err)
}
// Get the results.
usersReport, err := srv.Users.List().Domain("domain.com").MaxResults(100).Do()
if err != nil {
log.Fatalf("Unable to retrieve users in domain: %v", err)
}
// Report results.
if len(usersReport.Users) == 0 {
fmt.Print("No users found.\n")
} else {
fmt.Print("Users:\n")
for _, u := range usersReport.Users {
fmt.Printf("%s (%s)\n", u.PrimaryEmail, u.Name.FullName)
}
}
}