users.list返回403错误:未授权访问此资源/ api

时间:2016-11-03 10:03:04

标签: node.js google-admin-sdk google-api-nodejs-client

我正在尝试使用node.js googleapis库和服务帐户检索用户列表。

我关注this guide以执行Google Apps域范围的权限授权'。有一些Java和Python的例子,但不幸的是没有node.js,这似乎有点不同。

我尝试关注quickstart并完成前两个步骤,但之后它使用手动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);
        }
      });
    });

我错过了什么?

1 个答案:

答案 0 :(得分:0)

经过几个小时的实验后,我得出的结论是,无法使用服务帐户访问此特定API。虽然我在任何可以找到的文档中都没有明确说明,但快速入门似乎通过使用OAuth进程然后在文件中存储授权未来请求所需的令牌来克服此限制。如果我错了,请添加更好的答案!

我的解决方案是使用quickstart项目生成这些令牌,然后将快速入门中的凭据和令牌添加到我的项目中,并在我的服务器启动时使用它们,例如:

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

它不优雅,但它有效。