【问题标题】:NodeJS Example - Firebase Cloud Functions - Instantiate an Admin SDK Directory service objectNodeJS 示例 - Firebase Cloud Functions - 实例化 Admin SDK 目录服务对象
【发布时间】:2018-04-21 18:54:21
【问题描述】:

目标

googleapis 与 Firebase Cloud Functions 结合使用,以获取我的 G Suite 域中所有用户的列表。

问题

我如何Instantiate an Admin SDK Directory service object。我没有看到 NodeJS 示例,也不清楚如何使用googleapis 设置和发出请求。

上下文

此代码从 Firebase Cloud Functions 运行,并且似乎可以通过身份验证。现在,我如何在以下代码中设置//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!")
    })
})

【问题讨论】:

  • 我的第一个 JWT 没有提供域范围的委派,当我添加 impersonator 时出现错误。代码和设置很好。我在我的服务帐户(已使用 DwD 设置)中创建了一个 new 密钥,并换入了新的 key.json(从 GCP 自动下载)。这解决了这个问题,并且应用程序正在以我们 G Suite 域中的任何用户的身份向驱动器 API 发出请求!当我获得使用 Directory API 的代码时,我会添加一个答案。

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


【解决方案1】:

操作顺序:

  1. 在 Google Cloud Console 中创建服务帐号凭据
  2. 向服务帐户添加域范围的委派
  3. 在 G Suite 中授权 API - 安全 - 高级
  4. 返回服务帐户并下载.json 密钥文件

我过早下载了.json 密钥文件,例如在授权 G Suite 中的 API 之前。使用 DwD 设置服务帐户并然后在 G Suite API 中授权 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 请求,除非它们来自您的应用程序。请参阅 in this example Cloud Function 使用 admin.auth().verifyIdToken(idToken)... 来验证请求是否已通过 Firebase 身份验证。

如果您没有正确处理您的 G Suite DwD Cloud Function,您可能会将您的 G Suite API 暴露给公众。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多