Firebase signInwithRedirect()始终转到localhost而不是我的应用

时间:2018-02-09 17:55:49

标签: javascript angularjs ionic-framework firebase-authentication

CONTEXT

我正在使用angularJS /离子应用上的Xcode(ios应用),试图使用Firebase身份验证功能使用Facebook登录。

要做到这一点,我正在使用signInWithRedirect()getRedirectResult(),它似乎正常工作,直到我的代码到达getRedirectResult(),没有显示错误但在访问接受后facebook正在重定向我在Safari上: localhost:8080 / var / containers / Bundle / Application / ****** / testApp.app/www/index.html#/login ,而不是我的应用登录页面。

我在Developper Facebook网站上设置了facebook应用程序,并将https://testApp-32338.firebaseapp.com/__/auth/handler设置为OAuth URI字段。

问题

Xcode或某处(.XML或其他)中是否有文件,我必须写一些关于此重定向的内容?如何使用Facebook登录我的ionic / ios应用程序?

这是我的代码:

//********** EDIT 1 CODE **********//

function loginFacebook ()
{

var provider = new firebase.auth.FacebookAuthProvider();
provider.addScope('user_birthday, email, public_profile');


firebase.auth().signInWithRedirect(provider);
// The only console.log() i can see in the console
console.log("0");

firebase.auth().getRedirectResult().then(function(result) {
console.log("1");
  if (result.credential) {
  console.log("2");
    var user = result.user;
    // This gives you a Facebook Access Token. You can use it to access the Facebook API.
    var token = result.credential.accessToken;
    console.log("3");
  }
  // The signed-in user info.
  var user = result.user;
  
}).catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  // The email of the user's account used.
  var email = error.email;
  // The firebase.auth.AuthCredential type that was used.
  var credential = error.credential;

});

}

编辑1:(02/11/2018)

根据Firebase,它似乎是一个已知问题,可能wkwebview是IOS /离子应用程序上此问题的主要原因。在这个链接中:https://ionicframework.com/docs/wkwebview/离子正在谈论“跨源资源共享”(CORS),我真的不熟悉这个我如何“陷阱”signInWithRedirect()结果将其更改为要求的网址?这会解决我的问题吗?有人已经能够应对这个问题吗?

编辑2:(02/12/2018)

尝试使用cordova-facebook4-plugin的新方法,一切似乎都有效,甚至重定向部分到我的应用程序并收集数据(名称,生日,令牌......等)。未知部分是如何将我的结果链接到firebase身份验证提供程序?在Firebase文档(https://firebase.google.com/docs/auth/web/facebook-login)中,方法是使用signInWithRedirect()(请参阅我的第一次编辑)或signInWithPopUp()(不在手机应用中使用),有一个signInWithCustomToken() ,但当我放入Facebook给定令牌时,它不起作用。不幸的是,我也尝试了universal-links方法,结果相同。你们是怎么做到这一点的?是否有人实现了cordova-facebook4-plugin和Firebase之间的联系?

//********** EDIT 2 CODE **********//

function loginFacebook()
{

var fbLoginSuccess = function (userData) {
   console.log("UserInfo: " + JSON.stringify(userData));
  facebookConnectPlugin.getAccessToken(function(token) {
    console.log("Token: " + token);

    // What to do with this Token to link to Firebase ???
  });
}

facebookConnectPlugin.login(["public_profile", "user_birthday"], fbLoginSuccess,
  function (error) {
    console.error(error)
  }
);

}

编辑3:(02/14/2018)正在工作!!!

最后它是有效的,非常感谢@mootrichard!这是我最后的工作代码:

//********** EDIT 3 CODE FINAL **********//

// SIGNIN WITH FACEBOOK4
 
function loginFacebook()
{

var provider = new firebase.auth.FacebookAuthProvider();

var fbLoginSuccess = function (userData) {
   console.log("UserInfo: " + JSON.stringify(userData));

facebookConnectPlugin.getAccessToken(function(token) {
   console.log("Token: " + token);
   connectProvider(token);
   
  });
}
facebookConnectPlugin.login(["public_profile", "user_birthday"], fbLoginSuccess,
  function (error) {
    console.error(error)
  }
);
 
 
 
//CONNECT FACEBOOK TO THE FIREBASE PROVIDER

function connectProvider(access_token)
{
// Build Firebase credential with the Facebook access token.
var credential = firebase.auth.FacebookAuthProvider.credential(access_token);

// Sign in with credential from the Google user.
firebase.auth().signInWithCredential(credential).then(function(result) {

        var firstName = result.displayName.split(' ').slice(0, -1).join(' ');
        var lastName = result.displayName.split(' ').slice(-1).join(' ');
        
        console.log("The firstName is : ", JSON.stringify(firstName));
        console.log("The lastName is : ", JSON.stringify(lastName));

 $state.go("anOtherPage");

}).catch(function(error) {
    // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
    // The email of the user's account used.
  var email = error.email;
    // The firebase.auth.AuthCredential type that was used.
  var credential = error.credential;

});

}

1 个答案:

答案 0 :(得分:1)

我想你想看一下Firebase的高级指南。由于您已拥有令牌,因此您只需使用以下命令创建Facebook凭据:

$.ajax('showads.js')
 .fail(function(d){
debugger //do some stuff here
});

您可以在https://firebase.google.com/docs/auth/web/facebook-login#advanced-authenticate-with-firebase-in-nodejs找到他们的示例。