2016-11-03 1 views
1

J'essaie de récupérer une liste d'utilisateurs utilisant la bibliothèque node.js googleapis et un compte de service.users.list renvoie 403 Erreur: Non Autorisé à accéder à cette ressource/API

J'ai suivi this guide pour 'Effectuer la délégation d'autorité de domaine Google Apps à l'échelle du domaine'. Il y a des exemples pour Java et Python, mais malheureusement pas pour node.js, ce qui semble fonctionner différemment.

J'ai essayé de suivre le quickstart et j'ai terminé les deux premières étapes, mais il utilise ensuite un flux OAuth manuel au lieu d'un compte de service.

J'ai donc essayé de suivre l'exemple here pour autoriser l'utilisation d'un compte de service. Que tout semble fonctionner jusqu'à ce que j'envoie la demande, je reçois une erreur: Error: Not Authorized to access this resource/api avec le code: 403.

Voici mon code:

var google = require('googleapis'), 
    GoogleAuth = require('google-auth-library'), 
    authFactory = new GoogleAuth(), 
    admin = google.admin('directory_v1') 

authFactory.getApplicationDefault(function (err, authClient) { 
     console.log('GOT APPLICATION DEFAULT', authClient) 
     if (err) { 
     console.log('Authentication failed because of ', err); 
     return; 
     } 
     if (authClient.createScopedRequired && authClient.createScopedRequired()) { 
     console.log('SCOPE REQUIRED') 
     var scopes = ['https://www.googleapis.com/auth/admin.directory.user']; 
     authClient = authClient.createScoped(scopes); 
     } 

     var request = { 
     auth: authClient, 
     domain: 'mydomain.com' 
     }; 
     console.log('request:', request) 
     admin.users.list(request, function (err, result) { 
     if (err) { 
      console.log('admin.users.list error', err); 
     } else { 
      console.log(result); 
     } 
     }); 
    }); 

Qu'ai-je manqué s'il vous plaît?

Répondre

0

Après plusieurs heures d'expérimentation, je suis arrivé à la conclusion que cette API particulière n'est pas accessible avec un compte de service. Bien qu'il ne soit pas explicitement indiqué dans les documents que je puisse trouver, le démarrage rapide semble surmonter cette limitation en utilisant un processus OAuth et en stockant ensuite dans un fichier les jetons requis pour autoriser de futures requêtes. Si je me trompe, veuillez ajouter une meilleure réponse!

Ma solution est d'utiliser le projet de démarrage rapide pour générer ces jetons, puis ajoutez les informations d'identification et les jetons de la QuickStart à mon projet et de les utiliser à chaque fois que mon serveur commence, quelque chose comme:

let tokens = require('./credentials/tokens.json'), 
    credentials = require('./credentials/oauth_credentials.json'), 
    clientSecret = credentials.installed.client_secret, 
    clientId = credentials.installed.client_id, 
    redirectUrl = credentials.installed.redirect_uris[0], 
    google = require('googleapis'), 
    GoogleAuth = require('google-auth-library'), 
    authFactory = new GoogleAuth(), 
    admin = google.admin('directory_v1'), 
    oauth2Client = new authFactory.OAuth2(clientId, clientSecret, redirectUrl); 
    oauth2Client.credentials = tokens; 
    let request = { 
     auth: oauth2Client, 
     domain: 'coachaxis.com' 
    }; 
    console.log('request:', request) 
    admin.users.list(request, function (err, result) { 
     if (err) { 
     console.log('admin.users.list error', err); 
     } else { 
     console.log(result); 
     } 
    }); 

Ce n'est pas élégant mais ça marche.

+0

J'ai été en mesure d'obtenir une liste d'utilisateurs avec un compte de service, mais je pense que vous devez toujours utiliser un processus OAuth pour obtenir un jeton d'accès. Il y a beaucoup de configuration sur Google qui doit se faire correctement avant que votre jeton ne fonctionne correctement, y compris mais sans s'y limiter: autoriser l'étendue dans votre compte de service (dans la console d'administration, section Sécurité), utiliser une sorte de Compte administrateur en tant que "sous" qui a accès aux utilisateurs en lecture. – Rob