如何使用JJT使用NodeJS客户端库访问Google Directory(Admin SDK)?

时间:2014-03-25 16:21:25

标签: node.js google-admin-sdk jwt

我尝试制作一个服务器应用程序,将用户添加/删除到我的域组。请注意,它不会与用户进行任何交互,而是服务器到服务器应用程序。

我在Google API控制台中注册了我的应用程序,下载了密钥并通过发出

将其转换为.pem
openssl pkcs12 -in my_google_key.p12 -out my_google_key.pem -nocerts -nodes

然后我去过Domain Administration,Security - >高级设置 - >身份验证 - >管理OAuth客户端访问权限。在那里,我在授权API客户端中添加了一条记录。我使用了从控制台中的服务帐户获得的客户端ID,并使用了范围:

https://www.googleapis.com/auth/admin.directory.group.

我使用

为nodejs安装了googleapis
npm install googleapis

这是我的代码:

var googleapis = require('googleapis');

var SERVICE_ACCOUNT_EMAIL = 'My Service Account E-mail Address';
var SERVICE_ACCOUNT_KEY_FILE = 'my_google_key.pem'; // The .pem file is at the root of my application

var jwt = new googleapis.auth.JWT(
    SERVICE_ACCOUNT_EMAIL,
    SERVICE_ACCOUNT_KEY_FILE,
    null,
    ['https://www.googleapis.com/auth/admin.directory.group']
);

var client;

googleapis
.discover('admin', 'directory_v1')
.execute(function(err, data) {
    client = data;

    jwt.authorize(function(err, result) {
        console.log(jwt);
        client.admin.groups.list({
            "customer": "my_customer", // This is actually "my_customer"
            "domain": "domain.com" // The domain name I administer
        })
        .withAuthClient(jwt)
        .execute(function(err, result) {
            console.log(err);
            console.log(result);
        });
    });
});

运行此代码的结果是:

{ errors: 
    [ { domain: 'global',
        reason: 'forbidden',
        message: 'Not Authorized to access this resource/api' } ],
    code: 403,
    message: 'Not Authorized to access this resource/api' }

我错过了什么?如何使用Admin SDK授权我的应用程序?

1 个答案:

答案 0 :(得分:9)

1)确保您将域范围的权限委派给您的服务帐户。

2)服务帐户必须冒充有权访问Admin SDK Directory API的人。

初始化时包含它:

var jwt = new googleapis.auth.JWT(
    SERVICE_ACCOUNT_EMAIL,
    SERVICE_ACCOUNT_KEY_FILE,
    null,
    ['https://www.googleapis.com/auth/admin.directory.group'],
    account_with_Admin_SDK_access_to_impersonate@example.com
);

文档的这一部分详细解释了这两个问题https://developers.google.com/admin-sdk/directory/v1/guides/delegation#delegate_domain-wide_authority_to_your_service_account