无法使用"google-admin-sdk"观看管理员用户目录



我正在尝试使用google-admin-sdk连接到G-Suite的用户目录。我正在使用 API 密钥进行授权,但无法成功执行。

这是我正在使用的代码片段:

import { google } from 'googleapis';
import uuid from 'uuid/v4';
const API_KEY = 'my api key goes here';
google.admin({
version: 'directory_v1',
auth: API_KEY
}).users.list({
customer: 'my_customer',
maxResults: 10,
orderBy: 'email',
}, (err, res: any) => {
if (err) { return console.error('The API returned an error:', err.message); }
const users = res.data.users;
if (users.length) {
console.log('Users:');
users.forEach((user: any) => {
console.log(`${user.primaryEmail} (${user.name.fullName})`);
});
} else {
console.log('No users found.');
}
});

输出:

Login Required

有人可以告诉我我在这里做错了什么吗? 另外,如何进一步侦听谷歌 API 发出的事件?

---更新---

这是现在对我有用的片段:

import { JWT } from 'google-auth-library';
import { google } from 'googleapis';
// Importing the serivce account credentials
import { credentials } from './credentials';
const scopes = ['https://www.googleapis.com/auth/admin.directory.user'];
const adminEmail = 'admin_account_email_address_goes_here';
const myDomain = 'domain_name_goes_here';
async function main () {
const client = new JWT(
credentials.client_email,
undefined,
credentials.private_key,
scopes,
adminEmail
);
await client.authorize();
const service = google.admin('directory_v1');
const res = await service.users.list({
domain: myDomain,
auth: client
});
console.log(res);
}
main().catch(console.error);

--- 奖金提示---如果您在使用目录的其他方法时遇到任何Parse Error,请记住JSON.stringify请求正文。例如,在admin.users.watch方法上:

// Watch Request
const channelID = 'channel_id_goes_here';
const address = 'https://your-domain.goes/here/notifications';
const ttl = 3600; // Or any other TTL that you can think of
const domain = 'https://your-domain.goes';
const body = {
id: channelID,
type: 'web_hook',
address,
params: {
ttl,
},
};
// Remember to put this in an async function
const res = await service.users.watch({
domain,
customer: 'my_customer',
auth: client, // get the auth-client from above
event: 'add'
}, {
headers: {
'Content-Type': 'application/json'
},
// This is the important part
body: JSON.stringify(body),
});

正如您在官方文档中看到的那样,每个发送到"目录 API 的请求都必须包含一个授权令牌"。为了授权您的请求,您必须使用 OAuth 2.0。

您提供的是API 密钥,这不适合此过程。API 密钥通常用于访问公共数据,而不是像您当前情况那样用于访问用户的私有数据。

应改为按照节点.js快速入门中提供的步骤操作:

  • 首先,从 Google API 控制台获取客户端凭据。
  • 其次,授权客户端:在设置用户凭据和适当的scopes后获取访问令牌(该过程在快速入门中的函数authorizegetNewToken中完成(。
  • 最后,客户端获得授权后,调用 API(函数listUsers(。

更新:

如果要为此使用服务帐户,则必须执行以下步骤:

  • 按照此处指定的步骤向服务帐号授予全网域授权。
  • 在云控制台,为服务账号创建私钥并下载相应的 JSON 文件。将其复制到您的目录。
  • 使用服务帐户模拟有权访问此资源的用户(管理员帐户(。这是通过在创建 JWT 身份验证客户端时指示用户的电子邮件地址来实现的,如以下示例所示。

代码可以是类似于以下行的内容:

const {google} = require('googleapis');
const key = require('./credentials.json'); // The name of the JSON you downloaded
const jwtClient = new google.auth.JWT(
key.client_email,
null,
key.private_key,
['https://www.googleapis.com/auth/admin.directory.user'],
"admin@domain" // Please change this accordingly
);
// Create the Directory service.
const service = google.admin({version: 'directory_v1', auth: jwtClient});
service.users.list({
customer: 'my_customer',
maxResults: 10,
orderBy: 'email',
}, (err, res) => {
if (err) return console.error('The API returned an error:', err.message);
const users = res.data.users;
if (users.length) {
console.log('Users:');
users.forEach((user) => {
console.log(`${user.primaryEmail} (${user.name.fullName})`);
});
} else {
console.log('No users found.');
}
});

参考:

  • 目录 API:授权请求
  • 目录 API:节点.js快速入门
  • 全网域权限下放给您的服务帐号
  • Google Auth Library for Node.js

我希望这有什么帮助。

最新更新