经过几个小时的学习,我想出了其他方法。这个想法是:
- 使用Facebook iOS SDK从iOS应用程序登录并获取Facebook令牌。
- iOS应用程序将此令牌发送到云功能,使用Graph api获取用户配置文件,然后从Facebook uid创建自定义令牌。
- 将此自定义令牌发送回iOS应用程序。
- 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本地登录过程。
来源
2017-03-17 08:24:53
Tim
是的,我之前看过这篇文章,但这意味着如果我有100个品牌,我必须创建100个Firebase项目,并且每个项目仅供用户登录。此方法的缺点是什么? – Tim
我想你只是说缺点!通常要求Firebase提供程序化项目创建,并且您可以投你一票:https://firebase.google.com/support/contact/bugs-features/ –