Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在移动登录时丢失Firebase自定义声明_Javascript_Firebase_Firebase Authentication - Fatal编程技术网

Javascript 在移动登录时丢失Firebase自定义声明

Javascript 在移动登录时丢失Firebase自定义声明,javascript,firebase,firebase-authentication,Javascript,Firebase,Firebase Authentication,我在Firebase中使用自定义声明来设置管理员和组织id,以帮助我进行授权和多租户 最近我注意到,自定义声明正在被清除,毫无理由地变得未定义 在分析问题并试图重现它时,我注意到当用户注销并使用移动设备登录时,自定义声明被设置为未定义 这种行为可能发生在注销和登录web时,但我还无法在web上重现 我使用前端视图来管理和设置admin和organizationId自定义声明值,并调用后端云函数来实现这一点。这工作正常,值设置良好。但是,当用户注销并在手机上登录时,这些自定义声明将变得未定义,正如

我在Firebase中使用自定义声明来设置管理员和组织id,以帮助我进行授权和多租户

最近我注意到,自定义声明正在被清除,毫无理由地变得未定义

在分析问题并试图重现它时,我注意到当用户注销并使用移动设备登录时,自定义声明被设置为未定义

这种行为可能发生在注销和登录web时,但我还无法在web上重现

我使用前端视图来管理和设置admin和organizationId自定义声明值,并调用后端云函数来实现这一点。这工作正常,值设置良好。但是,当用户注销并在手机上登录时,这些自定义声明将变得未定义,正如我通过前面提到的前端视图所看到的那样

步骤

  • 将自定义声明(admin=true和organizationId=“companyXYZ”)设置为userA
  • 用户使用手机登录web应用程序
  • userA自定义声明(admin和organizationId)保持设置为原始值
  • userA注销
  • userA再次登录,自定义声明(管理员和组织ID)修改为未定义
  • 有什么想法吗

    登录代码

    doLogin(value){
     let t = this;
    
     return new Promise<any>((resolve, reject) => {
      localStorage.removeItem("user");
       firebase.auth().signInWithEmailAndPassword(value.email, value.password)
       .then(res => {
        var user = firebase.auth().onAuthStateChanged(function(user){
          if (user) {
            t.setUser(user);
            resolve(user);
          } else {
            reject('No user logged in');
          }
        })
        resolve(res);
       }, err => reject(err))
     }) 
    }
        setUser(user: any){
            let u: FirebaseUserModel = new FirebaseUserModel();
            u.image = user.photoURL;
            u.name = user.displayName;
            u.provider = user.providerData[0].providerId;
            u.email = user.email;
            u.uid = user.uid;
            user.getIdTokenResult().then ((idTokenResult) => {
              console.log(idTokenResult.claims)
              u.admin = idTokenResult.claims.admin? true: false;
              u.organizationId = idTokenResult.claims.organization;
            })
          }
    
    doLogout(){
         return new Promise((resolve, reject) => {
           if(firebase.auth().currentUser){
             //this.afAuth.auth.signOut();
             this.afAuth.signOut();
             resolve();
           }
           else{
             reject();
           }
         });
       }
    

    我不清楚你说的“清除”是什么意思。客户端应用程序代码根本无法影响自定义声明中设置的值。这只能使用特权后端代码进行更改。请编辑问题,以便更清楚地解释你所观察到的情况,以及这与你所期望的情况有何不同。嗨,道格。谢谢你的快速回答。当我说“清除”时,我的意思是自定义声明变得不明确。我使用前端视图来管理和设置admin和organizationId自定义声明值,并调用后端云函数来实现这一点。这很好,并且值设置得很好。但是,当用户注销并在手机上登录时,这些自定义声明将变得未定义,正如我在前面提到的前端视图中所看到的。为什么您希望用户注销后可以使用自定义声明?当用户注销时,有关该帐户的所有信息都将从客户端应用程序中清除,直到他们再次登录。对不起,我不清楚。我不希望在用户注销后使用自定义声明。问题是,当用户再次登录时,我必须检查organizationId以及他是否是管理员用户,但自定义声明未定义。在注销之前,自定义声明已设置好。然后用户注销,所有内容都从客户端应用程序中清除。但是当用户再次登录时,自定义声明是未定义的。这是您应该在问题本身中解释的所有信息。我建议编辑它,一步一步地解释你在做什么,以及结果如何不同于你的预期。