Firebase身份验证Javascript:setCookie for pending Credential for redirect

时间:2016-09-09 00:59:32

标签: javascript json cookies firebase firebase-authentication

我正在尝试使用singinwithredirect获取多个身份验证链接。我抓住错误.credential并使用JSON.stringify将其传递给Cookie。

从那里开始,我使用JSON.parse将其转换回对象,但当我尝试将凭证对象传递到result.user.link(credential)时,它会给我一个错误说明:

firebase.js:74 Uncaught Error: link failed: First argument "credential" must be a valid credential

我是否必须将JSON对象转换为Firebase对象才能将其传递到凭证中?对象最初的样子:

Ef {accessToken: "EAAQmrlAUQpEBAL4oiPWEJy.......", provider: "facebook.com"}

cookie ('string')转换回JSON后对象的样子:

Object {accessToken: "EAAQmrlAUQpEBAL4oiPWEJy.......", provider: "facebook.com"}

2 个答案:

答案 0 :(得分:1)

首先,我建议您使用sessionStorage而不是Cookie,因为它包含您不希望在页面关闭时泄漏的OAuth访问令牌。

解析json对象后。 检查提供者字段。基于此,您可以确定它是什么类型的凭证。例如,如果提供者是facbeook.com:

var cred = firebase.auth.FacebookAuthProvider.credential(obj['accessToken');

在这种情况下,您将使用解析对象中的accessToken初始化凭证。

答案 1 :(得分:1)

完成后,您应该小心删除缓存的accessToken和secret。

解析的JSON可能不是用于链接挂起凭据的有效firebase对象。您必须先将其传递到firebase auth提供程序对象,然后再进行链接。

// Read cookie
var pendingCred = document.cookie;

// Parse
var pendingCredObj = JSON.parse(pendingCred);

// Delete cookie
document.cookie ="pendingCred=" + null + "; expires=0";

// Link with appropriate auth provider object
if (pendingCredObj.provider == "twitter.com"){
    var pendingCredObjProv = firebase.auth.TwitterAuthProvider.credential(pendingCredObj.accessToken, pendingCredObj.secret);
} else if (pendingCredObj.provider == "facebook.com"){
    var pendingCredObjProv = firebase.auth.FacebookAuthProvider.credential(pendingCredObj);
} else if (pendingCredObj.provider == "google.com"){
    var pendingCredObjProv = firebase.auth.GoogleAuthProvider.credential(pendingCredObj);
} else if (pendingCredObj.provider == "password"){
    var pendingCredObjProv = firebase.auth.EmailAuthProvider.credential(pendingCredObj);
}

// Link pending credentials to original user account
auth.currentUser.link(pendingCredObjProv).then(function(user) {
    console.log("Account linking success", user);
}, function(error) {
    console.log("Account linking error", error);
});