Firebase - NodeJS:使用OAuth2 for Google API的域范围委派

时间:2017-10-30 17:39:21

标签: node.js firebase google-api google-cloud-functions google-authentication

目标:

此Firebase云功能应使用Cloud APIs 域范围的委派,以便任何用户都可以在Firebase数据库更改时更新某些 G Suite管理面板用户信息

问题:

我应该使用哪种方法来获取我的应用程序的domian范围委派。

详细说明:

我没有连接关于Google Identity Platform的点,我被困here at this step。 firebase托管的nodejs应用程序如何为Google API请求组建Web和访问令牌?

Firebase项目使用Google Cloud Platform项目,所以

我有......

  1. 通过API中的API /凭据向项目添加了service account actor GCP-控制台
  2. 选中启用G Suite域范围的委派
  3. 存储了private_key.JSON。
  4. 授权的API客户端(在G Suite管理面板中),其中包含服务帐户客户端ID
  5. 我应该使用......

    Firebase :也许会查看whitelisting area of Google OAuth2 settings,和/或使用services.json I got from firebase

    通过googleapis

    Google API :即使我使用firebase.auth.GoogleAuthProvider()来验证用户,也许可以使用google.auth.OAuth2从GCP获取域范围的授权(比如app或计算引擎)

    通过google-auth-library

    Google Auth :同样,即使我使用firebase.auth.GoogleAuthProvider()验证用户,也许可以使用new GoogleAuth()获取域范围的委派来自GCP(如app或计算引擎)

    更新

    我已经学会了:

    1. Google的npm包googleapis不适用于客户端(浏览器)。我现在正尝试在Firebase云功能中使用它

1 个答案:

答案 0 :(得分:0)

答案是:

使用googleapisJWT Service Tokens进行服务帐户身份验证。

实施例

以下代码部署到Firebase云功能,日志似乎表明身份验证成功。

Firebase功能日志

  1. 3:56:35.101 PM授权启动功能执行
  2. 3:56:35.620 PM授权成功连接!
  3. 3:56:35.668 PM授权函数执行耗时568 ms,状态代码完成:200
  4. NodeJS代码

    // 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!")
            }
            response.send("Successfully connected!")
        })
    })