firebase.auth()。currentUser为null

Kev*_*vin 5 authentication firebase google-admin-sdk firebase-authentication angular

我正在尝试在Angular 4应用中检索当前登录的Firebase用户的UID。但是,如果我将'firebase.auth()。currentUser'登录到控制台,则会得到'null'。因此,“ firebase.auth()。currentUser.uid”给出了“无法读取属性'uid'为null”的错误。

根据这篇文章https://firebase.google.com/docs/auth/web/manage-users,这意味着我当前尚未登录。尽管如此,我可以,因为我可以从数据库中读取数据(规则不允许未经身份验证的用户),并且登录方法未给出任何错误。

我还可以看到具有uid 1的用户已在firebase控制台中登录(... / u / 1 / project / my-project / authentication / users)

我的数据库规则:

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid",
        ".read": "$uid === auth.uid"
      }
    }
   }
}
Run Code Online (Sandbox Code Playgroud)

注意:我没有使用任何Firebase登录方法。我正在使用我的php后端来验证用户并为firebase生成自定义令牌,具体方法如下:https : //firebase.google.com/docs/auth/admin/create-custom-tokens

Angular 4登录代码:

constructor(private afAuth: AngularFireAuth) {
    this.login();
}

login() {
    console.log('We are logging in on Firebase :)');
    firebase.auth().signInWithCustomToken(localStorage.getItem('firebase_token')).catch(function (error) {
        console.log(error.message);
        console.log('You are not logged in!');
    });
    this.user = firebase.auth().currentUser;
    console.log(firebase.auth().currentUser);
    console.log(firebase.auth().currentUser.uid);
}
Run Code Online (Sandbox Code Playgroud)

控制台输出:

chat.service.ts:59 We are logging in on Firebase :)
chat.service.ts:65 null
ChatComponent_Host.html:1 ERROR TypeError: Cannot read property 'uid' of null
    at ChatService.Array.concat.ChatService.login (chat.service.ts:66)
    at new ChatService (chat.service.ts:23)
    at _createClass (core.es5.js:9572)
    at _createProviderInstance$1 (core.es5.js:9544)
    at resolveNgModuleDep (core.es5.js:9529)
    at NgModuleRef_.get (core.es5.js:10615)
    at resolveDep (core.es5.js:11118)
    at createClass (core.es5.js:10971)
    at createDirectiveInstance (core.es5.js:10802)
    at createViewNodes (core.es5.js:12230)
    at createRootView (core.es5.js:12125)
    at callWithDebugContext (core.es5.js:13506)
    at Object.debugCreateRootView [as createRootView] (core.es5.js:12823)
    at ComponentFactory_.create (core.es5.js:9916)
    at ComponentFactoryBoundToModule.create (core.es5.js:3333)
Run Code Online (Sandbox Code Playgroud)

小智 6

当Firebase仍未从本地加载数据时,您正在使用currentUser变量。因此,为了知道currentUser变量何时启动,您可以检查onAuthStateChanged的回调。

var currentUser;
firebase.auth().onAuthStateChanged(function(user){
        // user hols the reference to currentUser variable.
});
Run Code Online (Sandbox Code Playgroud)


Roh*_*ark 0

我认为您应该将代码修改为以下内容并重试:-

constructor(private afAuth: AngularFireAuth) {
    this.login();
}

login() {
    console.log('We are logging in on Firebase :)');
    firebase.auth().signInWithCustomToken(localStorage.getItem('firebase_token'))
    .then(success=>{
    this.user = firebase.auth().currentUser;
    console.log(firebase.auth().currentUser);
    console.log(firebase.auth().currentUser.uid);
    })
   .catch(function (error) {
        console.log(error.message);
        console.log('You are not logged in!');
    });

}
Run Code Online (Sandbox Code Playgroud)

通过使用then,您可以确保在访问登录的用户对象之前成功返回登录承诺。