Firebase自定义Auth与Microsoft Azure / Graph

时间:2017-11-02 12:34:52

标签: firebase-authentication azure-active-directory microsoft-graph

我正在构建一个使用Microsoft Graph登录的企业应用程序。成功签名后,我想使用令牌发送给Firebase Auth进行身份验证(这样我就可以保护对数据库的访问)。

成功登录后收到的令牌无法直接用于Firebase。

Firebase custom Auth instructions page上说:

  

获取项目的服务器密钥:

     
      
  1. 转到项目设置中的“服务帐户”页面。
  2.   
  3. 点击“服务帐户”页面Firebase管理SDK部分底部的“生成新私钥”。
  4.   
  5. 新服务帐户的公钥/私钥对会自动保存在您的计算机上。将此文件复制到您的身份验证服务器。
  6.   

第三点说您需要输入密钥到认证服务器。是否可以使用 Microsoft Graph Azure AD

Firebase为您提供的密钥是JSON文件。我已经检查了 Microsoft App注册门户,它允许您编辑应用Manifest,但没有运气。

JSON文件如下所示:

{
    "type": "service_account",
    "project_id": "APP_ID",
    "private_key_id": "KEY_ID_VALUE",
    "private_key": "-----BEGIN PRIVATE KEY----<KEY VALUE>-----END PRIVATE KEY-----\n",
    "client_email": "firebase-adminsdk-0ubvc@********.iam.gserviceaccount.com",
    "client_id": "XXXXXXXXXXXX",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-0ubvc%XXXXXXXX.iam.gserviceaccount.com"
}

我似乎无法找到任何涵盖此问题的github项目或stackoverflow线程。

如何使用MS Graph或Azure AD接收自定义令牌?

4 个答案:

答案 0 :(得分:5)

我现在已经完全解决了这个问题。通过对Stackoverflow的广泛研究和大量帮助,我设法解决了这个问题。

更新

目前已弃用数据库机密并使用旧版Firebase令牌生成器。现在Firebase Admin导入已经足够了。

所以,这些是我的发现:

<击> 1。您 DO 需要在创建Firebase令牌时将私钥发送到firebase功能。在Firebase控制台中,您可以解压缩密钥并将文件重命名为service-account.json。在执行Firebase deploy

之前,应将其放在功能文件夹中
  1. index.js文件中,您可以输入以下代码来获取服务文件:

    const admin = require('firebase-admin');
    
  2. 编写接受来自其他身份验证服务的信息的功能:

    // Create a Firebase token from any UID
    exports.createFirebaseToken = functions.https.onRequest((req, res) => {
    
      // The UID and other things we'll assign to the user.
      const uid = req.body.uid;
      const additionalClaims = {
        name: req.body.name,
        email: req.body.email
      };
    
      // Create or update the user account.
      const userCreationTask = admin.auth().updateUser(uid, additionalClaims).catch(error => {
    
        if (req.method === 'PUT') {
          res.status(403).send('Forbidden!');
        }
    
        if (req.method === 'GET') {
         res.status(403).send('Please use POST for this function');
        }
    
        // If user does not exists we create it.
        if (error.code === 'auth/user-not-found') {
          console.log(`Created user with UID:${uid}, Name: ${additionalClaims.name} and e-mail: ${additionalClaims.email}`);
          return admin.auth().createUser({
          uid: uid,
          displayName: additionalClaims.name,
          email: additionalClaims.email,
        });
            }
            throw error;
            console.log('Error!');
        });
    
    
        return Promise.all([userCreationTask]).then(() => {
          console.log('Function create token triggered');
          // Create a Firebase custom auth token.
          admin.auth().createCustomToken(uid, additionalClaims).then((token) => {
          console.log('Created Custom token for UID "', uid, '" Token:', token);
            res.status(200).send(token);
            return token
        });
      });
    });
    
  3. 使用res.status回复非常重要,因为这将完成任务。单个return语句不会这样做。 您可以在github

    找到来自 Firebase 的完整工作样本
    1. 您现在可以使用 Alamofire swift

      制作一个 HTTP-request ,看起来像这样
      Alamofire.request("https://us-central1-<YOUR DATABASE REFERENCE>.cloudfunctions.net/createFirebaseToken", 
      method: .post, parameters: parameters, encoding: JSONEncoding.default).
      responseString(completionHandler: { (token) in
          // Handle the result here
      })
      

      在这种情况下,Parameters是一个常规JSON文件,其中包含您要添加到用户Firebase帐户的内容。

    2. 重要拥有云功能网址的任何人都可以触发此令牌铸币。因此,请确保添加安全措施来处理此问题。 This is briefly mentioned in a Firecast video on youtube made by Firebase并在this thread in Stackoverflow

    3. 中进行了讨论
    4. 当您的客户收到该令牌时,您会在iOSAndroid中自定义身份验证,如文档中所述。

    5. 您现在已经过 Firebase Microsoft

    6. 的身份验证
    7. 我还添加了一个额外的安全层,通过检查我从Microsoft获得的ID是否与Firebase中经过身份验证的帐户中存储的ID相同。

答案 1 :(得分:1)

我已经为Firebase Web和基于浏览器的联合身份验证创建了一个示例here。来自Azure AD的身份验证响应通过功能进行验证,自定义firebase令牌并发送到前端;发送到Firebase Auth服务。

详细说明流程:https://medium.com/@alex.wauters/how-to-integrate-a-firebase-web-app-with-azure-active-directory-b5c0f01a0c24

答案 2 :(得分:0)

问题是您需要使用您自己的的一些代码来响应AAD IDP身份验证成功,然后生成要由Firebase使用的JWT。那个JWT is generated使用private key supplied by firebase。您表示至少部分代码是使用Java编写的,这是一个好消息,因为它是Firebase Admin SDK支持的语言之一。从理论上讲,我认为您可以在移动应用程序代码中执行该令牌生成,但我强烈建议不要这样做,因为这需要在您的应用程序中部署您的私钥,这会危及它。您需要站起来一个可以处理来自您的应用程序的身份验证请求的Web服务,并使用Firebase Admin SDK生成的JWT进行响应。一旦您的移动应用程序具有您的服务生成的JWT,那么它就可以使用它来连接到该用户的Firebase。

答案 3 :(得分:0)

它比你想象的要简单得多。在使用Microsoft进行身份验证并获得Microsoft凭据后,您只需获取该凭据的关联Microsoft用户ID即可。然后,您可以制作Firebase自定义令牌,并将Firebase uid设置为相同的Microsoft用户ID。例如,您可以使用Firebase Admin Node.js SDK执行以下操作:

admin.createCustomToken(msftUid, additionalUserClaims)
  .then(customToken => {
    // Return this to the client.
  })

将其发送回客户端后,您可以致电signInWithCustomToken(customToken),这将使用Firebase身份验证登录同一用户。该用户将currentUser.uid等于Microsoft用户ID。