Невозможно посмотреть каталог пользователей Admin с помощью `google-admin-sdk` - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь подключиться к каталогу пользователя G-Suite с помощью google-admin-sdk . Я использую ключ 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 Google?

--- ОБНОВЛЕНИЕ ---

Вот фрагмент кода, который работает для меня сейчас:

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

1 Ответ

1 голос
/ 06 февраля 2020

Как вы можете видеть в официальной документации , каждый запрос, отправляемый " API Справочника, должен включать токен авторизации ". Чтобы авторизовать ваш запрос, вы должны использовать OAuth 2.0 .

Вместо этого вы предоставляете ключ API , который не подходит для этого процесса. Ключи API обычно используются для доступа к общедоступным c данным, а не к личным данным пользователей, как в текущей ситуации.

Вместо этого вам следует выполнить действия, описанные в Node.js Quickstart :

  • Во-первых, получите учетные данные клиента из Google API Console.
  • Во-вторых, авторизуйте клиент: получите токен доступа после установки учетных данных пользователя и соответствующего scopes (процесс (sh в функциях authorize и getNewToken в быстром запуске).
  • Наконец, после авторизации клиента вызовите API (функция listUsers).

Обновление:

Если вы хотите использовать служебную учетную запись для этой , вам необходимо будет выполнить следующие действия:

  • Предоставить делегирование по всему домену Учетная запись службы, выполнив шаги, указанные здесь .
  • В консоли Cloud создайте закрытый ключ для учетной записи службы и загрузите соответствующий файл 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.');
  }
});

Ссылка:

Надеюсь, что это поможет.

...