Вопрос:

Пример NodeJS - Облачные функции Firebase - создание объекта службы каталогов Admin SDK

node.js jwt google-cloud-functions google-admin-sdk service-accounts

1020 просмотра

1 ответ

254 Репутация автора

Цель

Используйте googleapisс Firebase Cloud Functions, чтобы получить список всех пользователей в моем домене G Suite.

Вопрос

Как создать объект службы каталогов Admin SDK . Я не вижу пример NodeJS, и я не ясно, как настроить и сделать запрос с googleapis.

контекст

Этот код запускается из облачных функций Firebase, и похоже, что он аутентифицирован. Теперь, как мне настроить сервисный объект //TODOв следующем коде:

// Firebase Admin SDK
const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)

// Google APIs
const googleapis = require('googleapis')
const drive = googleapis.drive('v3')
const gsuiteAdmin = googleapis.admin('directory_v1')

// Service Account Key - JSON
let privatekey = require("./privatekey.json")

let jwtClient = new googleapis.auth.JWT(
    privatekey.client_email,
    null,
    privatekey.private_key,
    ['https://www.googleapis.com/auth/drive',
        'https://www.googleapis.com/auth/admin.directory.user'])

// Firebase Cloud Functions - REST
exports.authorize = functions.https.onRequest((request, response) => {
    //authenticate request
    jwtClient.authorize(function (err, tokens) {
        if (err) {
            console.log(err)
            return
        } else {
            console.log("Successfully connected!")
        }

        // TODO
        // USE SERVICE OBJECT HERE??
        // WHAT DOES IT LOOK LIKE?

        response.send("Successfully connected!")
    })
})
Автор: Chadd Источник Размещён: 08.11.2017 10:18

Ответы (1)


2 плюса

254 Репутация автора

Решение

Порядок действий:

  1. Создание учетных данных учетной записи службы в Google Cloud Console
  2. Добавить делегирование по всему домену в учетную запись службы
  3. Авторизация API в G Suite - Безопасность - Дополнительно
  4. Вернитесь к учетной записи службы и загрузите .jsonфайл ключа.

Я скачал .jsonфайл ключа слишком рано, например, перед авторизацией API в G Suite. Порядок, настройка служебной учетной записи с помощью DwD, а затем авторизация API в G Suite API и последующая загрузка .jsonфайла ключа важны.

Пример

// Firebase Admin SDK
const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)

// Google APIs
const googleapis = require('googleapis')
const drive = googleapis.drive('v3')
const directory = googleapis.admin('directory_v1')

// Service Account Key - JSON
let privatekey = require("./privatekey.json")
let impersonator = 'example@example.com'

let jwtClient = new googleapis.auth.JWT(
    privatekey.client_email,
    null, // not using path option
    privatekey.private_key,
    ['https://www.googleapis.com/auth/drive',
        'https://www.googleapis.com/auth/admin.directory.user',
        'https://www.googleapis.com/auth/admin.directory.user.readonly'],
    impersonator
)

// Firebase Cloud Functions - REST
exports.getUsers = functions.https.onRequest((request, response) => {
    //authenticate request
    jwtClient.authorize(function (err, tokens) {
        if (err) {
            console.log(err)
            return
        } else {
            console.log("Successfully connected!")
        }
        //Google Drive API
        directory.users.list ({
            auth: jwtClient,
            domain: 'example.com',
            maxResults: 10,
            orderBy: 'email',
            viewType: 'domain_public'
          }, function(err, res) {
            if (err) {
              console.log('The API returned an error: ' + err)
              return;
            }
            var users = res.users;
            if (users.length == 0) {
              console.log('No users in the domain.');
            } else {
              console.log('Users:');
              for (var i = 0; i < users.length; i++) {
                var user = users[i];
                console.log('%s (%s)', user.primaryEmail, user.name.fullName)
              }
              response.send(users)
            }        
        })
    })
})

ОБНОВИТЬ

Пример выше, не является безопасным. Облачная функция, особенно с делегированием по всему домену G Suite, не должна отвечать на запросы http, если они не поступают из вашего приложения. Посмотрите в этом примере, что Облачная функция использует admin.auth().verifyIdToken(idToken)...для проверки того, что запрос аутентифицирован Firebase.

Если вы неправильно обрабатываете свою облачную функцию G Suite DwD, вы рискуете представить свой API G Suite широкой публике.

Автор: Chadd Размещён: 11.11.2017 07:00
Вопросы из категории :
32x32