NodeJS 示例 - Firebase Cloud Functions - 实例化 Admin SDK 目录服务对象
NodeJS Example - Firebase Cloud Functions - Instantiate an Admin SDK Directory service object
目标
使用 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!")
})
})
运算顺序:
- 在 Google 云控制台中创建服务帐户凭据
- 向服务帐户添加全域委派
- 在 G Suite - 安全 - 高级
中授权 API
- 返回服务帐户并下载
.json
密钥文件
我过早下载了 .json
密钥文件,例如,在 G Suite 中授权 API 之前。命令,Setting Service Account with DwD and then authorization the API in G Suite API and then 下载.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)
}
})
})
})
更新
上面的例子不安全。 Cloud Functions,尤其是 G Suite Domain-wide Delegation,不应该响应 http 请求,除非它们来自您的应用程序。请参阅 in this example Cloud Function 使用 admin.auth().verifyIdToken(idToken)...
验证请求是否已通过 Firebase 进行身份验证。
如果您没有正确处理您的 G Suite DwD 云功能,您可能会将您的 G Suite API 暴露给 public。
目标
使用 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!")
})
})
运算顺序:
- 在 Google 云控制台中创建服务帐户凭据
- 向服务帐户添加全域委派
- 在 G Suite - 安全 - 高级 中授权 API
- 返回服务帐户并下载
.json
密钥文件
我过早下载了 .json
密钥文件,例如,在 G Suite 中授权 API 之前。命令,Setting Service Account with DwD and then authorization the API in G Suite API and then 下载.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)
}
})
})
})
更新
上面的例子不安全。 Cloud Functions,尤其是 G Suite Domain-wide Delegation,不应该响应 http 请求,除非它们来自您的应用程序。请参阅 in this example Cloud Function 使用 admin.auth().verifyIdToken(idToken)...
验证请求是否已通过 Firebase 进行身份验证。
如果您没有正确处理您的 G Suite DwD 云功能,您可能会将您的 G Suite API 暴露给 public。