firebase.auth().currentUser 为空

Posted

技术标签:

【中文标题】firebase.auth().currentUser 为空【英文标题】:firebase.auth().currentUser is null 【发布时间】:2017-12-06 19:25:32 【问题描述】:

我正在尝试在我的 Angular 4 应用程序中检索当前登录的 firebase 用户的 UID。但是,如果我将“firebase.auth().currentUser”记录到控制台,我会得到一个“null”。所以 'firebase.auth().currentUser.uid' 给出了一个 'Cannot read property 'uid' of 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"
      
    
   

注意:我没有使用任何 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)

【问题讨论】:

【参考方案1】:

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

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,您可以确保在访问已登录的用户对象之前成功返回了登录承诺。

【讨论】:

谢谢!我对 Angular 4 比较陌生,并没有真正考虑过这一点。感谢您快速明确的回答! 没问题!我很高兴能帮上忙。 在安全方面,是否可以在客户端存储token?【参考方案2】:

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

var currentUser;
firebase.auth().onAuthStateChanged(function(user)
        // user hols the reference to currentUser variable.
);

【讨论】:

以上是关于firebase.auth().currentUser 为空的主要内容,如果未能解决你的问题,请参考以下文章

每次页面重新启动时,Firebase.auth().currentUser 都会变为 null

如何观察 firebase.auth().currentUser.displayName 和其他属性的变化?

如何从 Firebase.auth.currentUser Android Kotlin 获取刷新令牌

与 react-redux-firebase 反应 isLoaded 是真的, isEmpty 似乎是假的,但 firebase.auth().currentUser 是 null - 可能是啥原因?

检查用户是否已登录Flutter&firebase auth |

Firebase Auth - 更新用户的电子邮件后,Firebase Auth 会注销用户