web-dev-qa-db-ja.com

firebase.auth()。currentUserがnull

Angular 4アプリで、現在ログインしているFirebaseユーザーのUIDを取得しようとしています。ただし、コンソールに「firebase.auth()。currentUser」をログに記録している場合'null'を取得します。そのため、 'firebase.auth()。currentUser.uid'は 'Cannot read property' uid'ofnull 'エラーを出します。

この記事によると 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"
      }
    }
   }
}

注: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);
}

コンソール出力:

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)
6
Kevin

コードを次のように変更して、再試行する必要があると思います:-

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!');
    });

}

thenを使用すると、サインインしたユーザーオブジェクトにアクセスする前に、サインインの約束が正常に返されたことを確認できます。

1
Rohan Stark

Firebaseがまだローカルからデータをロードしていない場合は、currentUser変数を使用しています。したがって、currentUser変数がいつ開始されるかを知るために、onAuthStateChangedのコールバックを確認できます。

var currentUser;
firebase.auth().onAuthStateChanged(function(user){
        // user hols the reference to currentUser variable.
});
8
Wilber Hinojosa