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

Posted

技术标签:

【中文标题】如何使用 JWT 通过 NodeJS 客户端库访问 Google Directory (Admin SDK)?【英文标题】:How do I use JWT to access Google Directory (Admin SDK) using NodeJS client libraries? 【发布时间】:2014-05-03 15:28:17 【问题描述】:

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

我在 Google API 控制台中注册了我的应用程序,下载了密钥并通过发布将其转换为 .pem

openssl pkcs12 -in my_google_key.p12 -out my_google_key.pem -nocerts -nodes

然后我去了域管理,安全 -> 高级设置 -> 身份验证 -> 管理 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】:

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

【讨论】:

以上是关于如何使用 JWT 通过 NodeJS 客户端库访问 Google Directory (Admin SDK)?的主要内容,如果未能解决你的问题,请参考以下文章

在 Rest API 中使用 Facebook 在 Express 和 NodeJS 中维护 JWT 的密钥和访问令牌

如何在没有用户名/密码的nodejs中创建JWT用户/访问令牌?

如何修改 AWS Cognito JWT Tokens,我们正在使用 NodeJS 技术问题

如何防止签名令牌用户通过浏览器开发工具访问 API 响应?

如何在不使用库的情况下验证本机 Javascript 中的 Azure OAuth 访问 JWT 令牌?

如何安全地保存从 auth0 登录收到的 JWT 令牌(nodejs express)