【问题标题】:Firebase logout user all sessionsFirebase 注销用户所有会话
【发布时间】:2019-07-09 07:08:18
【问题描述】:

我在我的 iOS 应用中使用 Firebase 身份验证。当用户使用 Firebase 登录我的应用程序然后注销该用户所有其他设备(会话)时,Firebase 中有什么方法吗?我可以使用 Firebase 管理 SDK 做到这一点吗?

【问题讨论】:

  • 移动应用程序需要您自己完成。在 Firebase 数据库的用户节点中获取一个令牌并在每次登录应用程序时重新生成它,如果令牌不同,则将此令牌与 appDidBecomeActiveappDidFinishLaunching 方法上已登录用户的令牌匹配手动注销用户并获取用户验证屏幕。
  • 只是一个想法,但这会是一个好的用户体验吗?我使用我的 iOS 设备,这样我就可以无缝地从一台设备移动到另一台设备 - 在我的 iMac 上聊天并在旅途中拿起我的手机继续对话(Handoff)。
  • @Jay 我认为注销所有会话的用户有利于提高安全性。
  • @Jay 这取决于应用程序类别。如果这与银行、钱包或个人数据应用程序等安全相关,那么最好保持单用户登录。
  • @TheTiger 我完全同意,这就是我问的原因。如何处理用户与应用程序的用例直接相关。我认为问题中的更多信息可能会导致答案,但是对于“注销”的含义来说有点模糊。换句话说,Firebase 可以在节点上有一个观察者,通知应用程序将用户从 Firebase 中注销,但这是否也意味着将用户从应用程序本身中注销?或者他们是否仍然可以访问他们当时正在检查的数据而没有新数据。

标签: javascript ios swift firebase


【解决方案1】:

当我遇到这个问题时,我使用云功能解决了它 请访问此链接了解更多详情https://firebase.google.com/docs/auth/admin/manage-sessions#revoke_refresh_tokens

执行以下操作;

  1. 使用 Firebase 云功能设置 Web 服务器(如果不存在)
  2. 使用 admin sdk(这是此方法唯一可行的方法)- [访问此链接] ( (https://firebase.google.com/docs/admin/setup#initialize_the_sdk)。
  3. 创建一个 api 来接收 uid 并撤销上面第一个链接中指定的当前会话
  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
  });

瞧,用户已注销。我希望这可以帮助您深入了解解决问题

【讨论】:

  • 这个“注销”当前会话不也一样吗?
  • 是的@JamesChen 它会注销 all 活动会话
  • 如何保留当前设备的登录用户并在所有其他设备上注销?
【解决方案2】:

Firebase 不提供此类功能。你需要自己管理它。

这里是Firebase Doc,他们没有提到任何与单用户登录相关的内容。

您可以为此做些什么-

Firebase数据库的用户节点(保存用户其他数据的地方)中获取一个令牌,并在每次登录应用程序时重新生成它,将此令牌与@中已登录用户的令牌(保存在本地)匹配987654324@ 和appDidFinishLaunching 或者可能每次您使用Firebase 执行任何操作时,或者可能在某个固定的时间间隔内。如果令牌不同,则手动注销用户并将用户带到身份验证屏幕。

【讨论】:

    【解决方案3】:

    我所做的是:

    在名为“activeSessions”的 firestore 中创建了集合。用户电子邮件作为对象的 id 和用于保存最新会话 id 的“activeID”字段。

    登录页面代码:

    每次用户登录时为用户会话生成 id。 将此 id 添加到 localstorage(每次添加前应清理)。 用当前用户电子邮件集合“activeSessions”中生成的 id 替换“activeID”。

    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:必须刷新窗口才能注销非活动会话。

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 2016-11-04
      • 2017-05-02
      • 2020-08-14
      • 2013-06-06
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      相关资源
      最近更新 更多