当用户首次使用电子邮件/密码登录时,我使用以下命令将Firebase的UserCredential
存储为json字符串:
private afAuth: AngularFireAuth;
...
this.afAuth.auth
.signInWithEmailAndPassword(email, password)
.then((userCredential: firebase.auth.UserCredential) => {
// serialize it as json
var credentialJson = JSON.stringify(userCredential);
// store it on device
this.settings.setValue(this.USER_CREDENTIALS_KEY, credentialJson)
});
现在,假设用户关闭了该应用程序,第二天又打开了该应用程序。我想使用凭据自动认证用户。因此,我将该json字符串反序列化为Firebase的UserCredential
,并尝试使用以下方式重新验证用户身份:
this.settings.getValue(this.USER_CREDENTIALS_KEY)
.then((result: string) => {
// json-deserialize it from device
let userCredential: firebase.auth.UserCredential = JSON.parse(result);
// use credential to authenticate the user
this.afAuth.auth.signInAndRetrieveDataWithCredential(userCredential.credential)
.then((credential: firebase.auth.UserCredential) => {
console.log("Successfully signed in");
})
});
但是signInAndRetrieveDataWithCredential
永远不会成功。错误消息与“令牌已过期”或“无效的用户凭证”或“用户不存在”相符。
本练习的全部目的是,我不想将电子邮件/密码(或者出于明显的原因,甚至将其哈希存储在用户的设备上)存储起来,以便在用户每次使用电子邮件/密码时重新使用它们来重新进行身份验证/她运行该应用。
此外,如果我可以重新使用UserCredential
对象来自动重新验证用户身份,那么无论登录方式是什么(即电子邮件/密码,谷歌,facebook等),我都可以始终使用一种方法重新认证用户。
p.s。我尝试使用令牌i.e this.afAuth.auth.signInWithCustomToken(userToken)
,但也没有运气。关于令牌的好处是令牌是一个字符串,我什至不需要对UserCredential
对象进行json序列化/反序列化。