最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 使用 golang 在 google admin sdk api 上获取 400 invalid_grant。有什么建议么?

    一分耕耘,一分收获!既然都打开这篇《使用 golangGoogle admin sdk api 上获取 400 invalid_grant。有什么建议么?》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

    问题内容

    我正在尝试编写一个 golang 脚本,该脚本使用我的服务帐户来管理我的 google 域。当我尝试执行简单的用户列表时出现错误: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 = "[email protected]"
    
        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)
            }
        }
    }

    解决方案

    我成功了。看起来这可能是多种因素的结合。 dazwilkin,是的,当我切换服务帐户的传递方式时,我收到了 401 未经授权的错误。我做了以下更改。

    1. 在配置中使用主题而不是电子邮件。
    2. 仅使用 admindirectoryuserscope 范围,而不是 admindirectoryuserreadonlyscope 范围(或两者的组合)。
    3. 在请求中包含域。如果没有它,我会收到 400 错误请求。
    4. 我通过以下链接验证了 directory 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 = "[email protected]" // Don't use Email, use Subject.
        config.Subject = "[email protected]"
    
        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)
            }
        }
    }

    本篇关于《使用 golang 在 google admin sdk api 上获取 400 invalid_grant。有什么建议么?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注编程网公众号!

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 使用 golang 在 google admin sdk api 上获取 400 invalid_grant。有什么建议么?
    • 5会员总数(位)
    • 22683资源总数(个)
    • 780本周发布(个)
    • 22 今日发布(个)
    • 179稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情