我在我的iOS应用中使用Firebase身份验证。当用户使用Firebase登录我的应用程序然后注销该用户的所有其他设备(会话)时,Firebase中是否有任何方法?我可以使用Firebase admin SDK来做到这一点吗?
答案 0 :(得分:1)
Firebase
不提供此类功能。您需要自己进行管理。
这里是Firebase Doc,他们还没有提到与单用户登录有关的任何内容。
这是您可以做的-
在Firebase
数据库中的“用户”节点中(在其中保存用户的其他数据)中获取一个令牌,并在每次登录到应用程序时重新生成该令牌,将该令牌与已经登录的用户令牌匹配(将其保存在本地)在appDidBecomeActive
和appDidFinishLaunching
中,或者每次您使用Firebase
执行任何操作时,或者可能处于固定的时间间隔。如果令牌不同,则手动注销用户,并引导用户进行身份验证屏幕。
答案 1 :(得分:1)
当我遇到此问题时,我使用云功能解决了该问题 请访问此链接以获取更多详细信息https://firebase.google.com/docs/auth/admin/manage-sessions#revoke_refresh_tokens
执行以下操作;
admin.auth().revokeRefreshTokens(uid)
.then(() => {
return admin.auth().getUser(uid);
})
.then((userRecord) => {
return new Date(userRecord.tokensValidAfterTime).getTime() / 1000;
})
.then((timestamp) => {
//return valid response to ios app to continue the user's login process
});
Voila用户已注销。我希望这能为解决问题提供见识
答案 2 :(得分:0)
我所做的是:
在 Firestore 中创建名为“activeSessions”的集合。用户电子邮件作为对象的 id 和“activeID”字段用于保存最近的会话 id。
登录页面代码:
每次用户登录时为用户会话生成 ID。 将此id添加到localstorage(每次添加前都应该清理)。 将“activeID”替换为“activeSessions”集合中生成的 ID 和当前用户电子邮件。
function addToActiveSession() {
var sesID = gen();
var db = firebase.firestore();
localStorage.setItem('userID', sesID);
db.collection("activeSessions").doc(firebase.auth().currentUser.email).set({
activeID: sesID
}).catch(function (error) {
console.error("Error writing document: ", error);
});
}
function gen() {
var buf = new Uint8Array(1);
window.crypto.getRandomValues(buf);
return buf[0];
}
function signin(){
firebase.auth().signInWithEmailAndPassword(email, password).then(function (user) {
localStorage.clear();
addToActiveSession();
}
}), function (error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
if (errorCode === 'auth/wrong-password') {
alert('wrong pass');
} else {
alert(errorMessage);
}
console.log(error);
};
}
然后我在每个页面上检查本地存储中的 id 会话是否与 firestore 中的“activeID”相同,如果不是,则注销。
function checkSession(){
var db = firebase.firestore();
var docRef = db.collection("activeSessions").doc(firebase.auth().currentUser.email);
docRef.get().then(function (doc) {
alert(doc.data().activeID);
alert(localStorage.getItem('userID'));
if (doc.data().activeID != localStorage.getItem('userID')) {
alert("bie bie");
firebase.auth().signOut().then(() => {
window.location.href = "signin.html";
}).catch((error) => {
// An error happened.
});
window.location.href = "accountone.html";
} else{alert("vse ok");}
}).catch(function (error) {
console.log("Error getting document:", error);
});
}
PS:必须刷新窗口才能注销非活动会话。