2016-11-03 11 views
1

node.js googleapisライブラリとサービスアカウントを使用してユーザーのリストを取得しようとしています。users.listは403エラーを返します:このリソース/ apiにアクセスするには承認されていません

「Google Appsドメイン全体の権限委任を実行する」には、this guideが続きました。 JavaとPythonには例がありますが、残念ながらnode.jsではそうではありません。

私はquickstartに従ってみて最初の2つのステップを完了しましたが、サービスアカウントではなく手動のOAuthフローを使用しました。

サービスアカウントを使用して承認するには、例hereに従ってみました。それはすべて、私はエラーを取得し、私がリクエストを送信するまで動作するようです:コードでError: Not Authorized to access this resource/api:403

は、ここに私のコードです:

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

私がしてください見逃していますか?

答えて

0

数時間の実験の後、私はこの特定のAPIにサービスアカウントでアクセスできないという結論に達しました。私が見つけ出すことができる文書に明示的には記載されていませんが、クイックスタートはOAuthプロセスを使用し、将来の要求を承認するために必要なトークンをファイルに保存することによってこの制限を克服しているようです。私が間違っているなら、より良い答えを加えてください!

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

それはエレガントではありません。私のサーバーが何かのように、起動するたびに

私のソリューションは、これらのトークンを生成するために、クイックスタートプロジェクトを使用して、私のプロジェクトにクイックスタートから資格情報とトークンを追加し、それらを使用することですそれは動作します。

+0

サービスアカウントでユーザーリストを取得できましたが、アクセストークンを取得するためには常にOAuthプロセスを使用する必要があると思います。トークンが正しく機能するには、サービスアカウント(管理コンソール、セキュリティセクション)のスコープを許可する、特定の種類の管理者アカウントは、読み取りユーザーにアクセスできる「サブ」です。 – Rob

関連する問題