2017-03-16 9 views
1

エンドユーザーがiOSアプリから食事を注文できるオーダーシステムがあります。各iOSアプリはブランドに属し、各ユーザーもブランドに属します。すべてのブランド情報を1つのFirebaseプロジェクトに組み込みます。マルチテナントアプリの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認証を各アプリケーションに使用しています。ただし、1つのFirebaseプロジェクトでは1つのFacebookアプリIDしか割り当てられません。つまり、brand1アプリをダウンロードしてFacebookでサインインすると、brand2アプリをダウンロードすると、そのユーザーアカウントは既に作成されており、ユーザーは混乱します。各ブランドに独自のユーザーデータベースがあることを願っていますが、引き続きすべてのブランドを管理し、1つのFirebaseプロジェクトにデータを格納できます。

私たちがやりたいことは、すべてのブランドと店舗をメインのfirebaseプロジェクトに入れてから、各ブランドごとにiOSアプリごとにfirebaseプロジェクトを作成することです。これらのfirebaseプロジェクトはユーザーログイン用です(登録が成功するとメインFirebaseプロジェクトにuidが追加されます)。すべてのユーザーの注文はメインfirebaseプロジェクトに保存されます。

可能ですか?または他のより良いソリューション?

答えて

0

アプリ用に独立したユーザーが必要な場合は常に、そのアプリの新しいプロジェクトが必要になります。 this article(Android用ですが、iOS- の場合は、使用する各プロジェクトのクライアントで新しいFirebaseアプリを初期化する必要があります)の手順に従ってプロジェクトごとに複数のデータベースを使用できます。

+0

はい、以前はこの記事を見てきましたが、100のブランドがあれば100個のFirebaseプロジェクトを作成しなければならず、各プロジェクトはユーザーサインインのためだけです。 – Tim

+0

私はあなたが不利な点を述べたと思います! Firebaseがプログラムによるプロジェクト作成を提供することが一般的に求められています。https://firebase.google.com/support/contact/bugs-features/ –

1

数時間の研究の後、私は他のアプローチを考え出します。アイデアは:

  1. iOSアプリからサインインしてFacebookトークンを取得するFacebook iOS SDKを使用します。
  2. iOSアプリは、このトークンをクラウド機能に送信し、Graph APIを使用してユーザープロフィールを取得し、Facebook uidからカスタムトークンを作成します。
  3. このカスタムトークンをiOSアプリに送り返します。
  4. iOSアプリはこのトークンを使用してFirebaseにログインします。

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ネイティブサインインプロセスを実装する必要があることを意味します。

+1

このアプローチでは、Twitterを実装する必要もありますご自分でログインしてください。 –

+0

あなたは正しいです。 Firebaseプロジェクトの各アプリにFacebookのアプリIDを設定できるとすれば良いと思う。 – Tim

+0

カスタムトークンがFirebase Authでどのように動作しましたか? – Ayyappa

関連する問題