Firebase自定义Auth与Microsoft Azure/Graph

Gio*_*usa 7 azure-active-directory firebase-authentication microsoft-graph

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

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

Firebase自定义身份验证说明页面上,它说:

获取项目的服务器密钥:

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

第三点说你需要输入密钥到认证服务器.这可能使用Microsoft GraphAzure 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"
}
Run Code Online (Sandbox Code Playgroud)

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

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

Gio*_*usa 5

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

UPDATE

数据库机密目前已弃用,并使用旧版Firebase令牌生成器.现在Firebase Admin进口已经足够了.

所以,这些是我的发现:

1.你不要需要铸币一个火力地堡令牌时,您的私有密钥发送给您的火力功能.在Firebase控制台中,您可以解压缩密钥并将文件重命名为service-account.json.在执行之前,应该将它放在您的Functions文件夹中Firebase deploy

  1. 在您的index.js文件中,您可以输入以下代码来获取服务文件:

    const admin = require('firebase-admin');
    
    Run Code Online (Sandbox Code Playgroud)
  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
        });
      });
    });
    
    Run Code Online (Sandbox Code Playgroud)

回复是非常重要的,res.status因为这将完成任务.单个return声明不会这样做.可以在github上找到Firebase自己的完整工作样本

  1. 现在,您可以做一个HTTP请求,可能看起来像这样使用Alamofireswift

    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
    })
    
    Run Code Online (Sandbox Code Playgroud)

    在这种情况下,该Parameters常规JSON文件包含您要添加到用户Firebase帐户的内容.

  2. 重要信息任何拥有云功能URL的人都可以触发此令牌铸造.因此,请确保添加安全措施来处理此问题.在Firebase制作的youtube上的Firecast视频中简要提到了这一点,并在Stackoverflow中的这个主题中进行了讨论

  3. 当您的客户收到令牌时,您将在iOSAndroid中按照文档中的说明进行自定义身份验证.

  4. 您现在已经过FirebaseMicrosoft的身份验证

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