【发布时间】:2019-08-16 04:16:02
【问题描述】:
我正在尝试编写一个使用我的服务帐户来管理我的谷歌域的 golang 脚本。当我尝试创建一个简单的用户列表时出现错误:400 invalid_grant。看来我正在正确使用我的服务帐户(?),并且我的服务帐户是超级管理员。我在 java 代码中使用凭据;所以我知道它是有效的。有什么想法吗?
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)
}
config, err := google.JWTConfigFromJSON(serviceAccountJSON,
directory.AdminDirectoryUserScope,
directory.AdminDirectoryUserReadonlyScope,
)
// Add the service account.
config.Email = "serviceaccount@domain.com"
srv, err := directory.New(config.Client(context.Background()))
if err != nil {
log.Fatalf("Could not create directory service client => {%s}", err)
}
// The next step fails with:
//2019/03/25 10:38:43 Unable to retrieve users in domain: Get https://www.googleapis.com/admin/directory/v1/users?alt=json&maxResults=10&orderBy=email&prettyPrint=false: oauth2: cannot fetch token: 400 Bad Request
//Response: {
// "error": "invalid_grant",
// "error_description": "Robot is missing a project number."
//}
//exit status 1
usersReport, err := srv.Users.List().MaxResults(10).OrderBy("email").Do()
if err != nil {
log.Fatalf("Unable to retrieve users in domain: %v", err)
}
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)
}
}
}
【问题讨论】:
-
您是否有效地遵循了这些说明,特别是 (a) 授权步骤; (b) “注”?当您写下您在 Java 中使用过服务帐户时,是出于非常相似的目的吗?即它是否适用于 Java 但不适用于 Go? developers.google.com/admin-sdk/directory/v1/guides/delegation
-
我试过了,但我很难访问 G Suite 域。我认为 Google Golang 示例不正确。请尝试
config.Email="[[Service Account Email]]和config.Subject=[[User-being-delegated Email Address]] -
我要去“问一个朋友”,因为虽然我得到了 401(未经授权),但我无法让它工作。将在我的专家指导下在这里报告。
-
我无法让它在 Golang 中工作。我用 Python 写了一个等效的版本,它可以工作。继续调查。 gist.github.com/DazWilkin/dca8c3db8879765632d4c4be8d662074
标签: go google-admin-sdk google-directory-api