2

J'ai essayé d'effectuer une requête par rapport à l'API Admin de Google pour répertorier tous les utilisateurs de mon organisation Google Apps. J'ai les autorisations pour faire cette requête dans le web UI example et obtenir des résultats, mais il 403 lorsque j'essaie de faire la requête avec un compte de service.API Google Apps 403 avec compte de service

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) 
    } 
} 

Chaque fois que j'exercerai je reçois un 403. Les mêmes paramètres de requête fonctionne dans la section Try it!here donc je ne sais pas pourquoi il échoue.

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

+1

avez-vous donné l'accès au compte de service? – DaImTo

+1

Vous devez attribuer à votre compte de service une délégation sur l'ensemble du domaine https://developers.google.com/drive/web/delegation. Suivez les étapes mentionnées dans la documentation. – SGC

+0

J'ai maintenant donné l'accès au compte de service et j'attends que cela se propage. Merci pour le conseil. –

Répondre

2

Je sais que cette question est d'un an, mais je ne pourrais pas trouver quoi que ce soit à ce sujet partout - mais ive juste réussi à le réparer après l'exécution dans la même erreur que vous.

fondamentalement, vous devez définir un utilisateur de délégation à votre config, par exemple:

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 = "[email protected]" 

    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) 
    } 
} 

Voir https://github.com/golang/oauth2/blob/master/google/example_test.go#L118

espérons que cette aide quelqu'un d'autre!