我们有一个订购系统,最终用户可以从他们的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项目中。
有可能吗?或任何其他更好的解决方案?
答案 0 :(得分:1)
每当您需要一个应用程序的隔离用户集时,您将需要该应用程序的新项目。您可以按照this article中的说明为每个项目使用多个数据库(适用于Android,但它与iOS类似 - 您必须在客户端为您要使用的每个项目初始化一个新的Firebase应用程序。
答案 1 :(得分:1)
经过几个小时的学习,我想出了其他方法。这个想法是:
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本机登录过程。