管理多租户应用的firebase用户

时间:2017-03-16 09:36:11

标签: ios firebase firebase-authentication

我们有一个订购系统,最终用户可以从他们的iOS应用程序订购餐点。每个iOS应用程序都属于一个品牌,每个用户也属于一个品牌。我们将所有品牌信息放在一个firebase项目中。数据库结构是:

-brands
 -- brand_id_1:
    -- information
 -- brand_id_2:
    -- information

-stores
 -- store_id_1:
    -- brand_id:brand_id_1
    -- more information
 -- store_id_2:
    -- brand_id:brand_id_1
    -- more information
-orders
 --brand_id_1:
   --order_id_1:
     --orderinfo

 --brand_id_2:
   --order_id_4:
     --orderinfo

-users
  -- user_id_1:
     -- brand_id:brand_id_1
     -- userinfo
  -- user_id_2:
     -- brand_id:brand_id_2
     -- userinfo

我们使用Facebook和Twitter身份验证登录每个应用程序。但是,一个firebase项目只能分配一个Facebook应用程序ID。这意味着如果用户下载brand1应用并通过Facebook登录,当他或她下载brand2应用时,用户帐户将被创建,我们的用户将会感到困惑。我们希望每个品牌都有自己的用户数据库,但我们仍然可以管理所有品牌并将数据存储在一个firebase项目中。

我们想要做的是将所有品牌和商店放在一个主要的firebase项目中,然后为每个品牌只为每个iOS应用创建一个firebase项目。这些firebase项目仅供用户登录(注册成功时将uid放入主firebase项目),所有用户订单将保存到我们的主firebase项目中。

有可能吗?或任何其他更好的解决方案?

2 个答案:

答案 0 :(得分:1)

每当您需要一个应用程序的隔离用户集时,您将需要该应用程序的新项目。您可以按照this article中的说明为每个项目使用多个数据库(适用于Android,但它与iOS类似 -  您必须在客户端为您要使用的每个项目初始化一个新的Firebase应用程序。

答案 1 :(得分:1)

经过几个小时的学习,我想出了其他方法。这个想法是:

  1. 使用Facebook iOS sdk从iOS应用登录并获取Facebook令牌。
  2. iOS应用程序将此令牌发送到云端功能,使用Graph api获取用户配置文件,然后从Facebook uid创建自定义令牌。
  3. 将此自定义令牌发送回iOS应用程序。
  4. iOS应用使用此令牌登录firebase。
  5. iOS代码:

    func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
            if let token = result.token {
                print(token.userID)
                print(token.appID)
                signInuser(with: token)
            }
        }
    
    func signInuser(with token:FBSDKAccessToken) {
            Alamofire.request("https://xxx.cloudfunctions.net/verifyFacebookUser", method: .post, parameters: ["token":token.tokenString]).responseJSON(completionHandler: { (response) in
                switch response.result {
                case .success(let data):
                    if let json = data as? [String:String] {
                        FIRAuth.auth()?.signIn(withCustomToken: json["token"]!, completion: { (user, err) in
                            if let error = err {
                                print(error)
                            }else {
                                print(user!.displayName)
                                print(user!.email)
                            }
                        })
                    }
    
    
                case .failure( let error):
                    print(error)
                }
            })
    
        }
    

    云功能:

    const functions = require('firebase-functions');
    const admin = require('firebase-admin');
    const graph = require('fbgraph');
    
    var serviceAccount = require("./serviceAccountKey.json");
    
    admin.initializeApp({
      credential: admin.credential.cert(serviceAccount),
      databaseURL: "https://xxx.firebaseio.com"
    });
    
    exports.verifyFacebookUser = functions.https.onRequest((req,res) => {
      if (!req.body.token) {
        return res.status(400).send('Access Token not found');
      }
    
       graph.setAccessToken(req.body.token);
       graph.get("me?fields=id,name,email", function(err, result) {
         const firebaseUid = "fb:"+result.id;
         admin.auth().createUser({
           uid:firebaseUid,
           displayName:result.name,
           email:result.email
         }).then(function(userRecord){
           console.log(userRecord)
           admin.auth().createCustomToken(userRecord.uid)
             .then(function(customToken) {
               res.send({token:customToken});
             })
             .catch(function(error) {
               console.log("Error creating custom token:", error);
             })
         });
    
       });
    });
    

    使用此方法,每个品牌的iOS应用程序将要求用户同意从Facebook登录,即使他或她已经从不同的品牌应用程序登录。但是,这意味着iOS应用程序需要实施Firebase SDK已经提供的Facebook本机登录过程。