【问题标题】:Firebase getToken() TypeError: Cannot read propertyFirebase getToken()类型错误:无法读取属性
【发布时间】:2016-10-22 10:33:08
【问题描述】:

我正在尝试获取我当前登录的网站用户的令牌。但是,javascript 无法为我获得价值。我认为这里有两个问题:

  1. 当我在开始时获取 Auth.currentUser 时,我收到“TypeError:无法读取属性 'getToken' of null”的错误。但是当我在控制台中输入 Auth.currentUser.getToken() 时,实际上会显示带有令牌的对象。

  2. getToken() 返回给我的是一个 promise 对象,它的键 'ea' 包含令牌的值。但是当我做 Auth.currentUser.getToken().ea 它让我'null'。如何直接从对象中检索令牌?

谢谢!

我获取令牌的代码:

var Auth = firebase.auth()
var token = Auth.currentUser.getToken()

此屏幕截图可能会有所帮助:

【问题讨论】:

    标签: javascript firebase firebase-authentication


    【解决方案1】:

    根据documentation of firebase.User:getIdToken()

    将用于向 Firebase 服务识别用户的 JWT 令牌返回。

    如果当前令牌尚未过期,则返回当前令牌,否则将刷新令牌并返回一个新令牌。

    该方法返回一个承诺,因为它可能需要往返于 Firebase 服务器以防令牌过期:

    Auth.currentUser.getIdToken().then(data => console.log(data))
    

    或者在更经典的 JavaScript 中:

    Auth.currentUser.getIdToken().then(function(data) {
        console.log(data)
    });
    

    日志输出:

    嗯...biPA

    更新:为确保用户在获取令牌之前已登录,请在onAuthStateChanged listener 中运行上述代码:

    firebase.auth().onAuthStateChanged(function(user) {
      if (user) {
        user.getIdToken().then(function(data) {
          console.log(data)
        });
      }
    });
    

    【讨论】:

    • 虽然这种方式直接得到了我的token字符串,但仍然没有解决TypeError的问题。但非常感谢您的回答,这很有帮助。
    • 表示当前没有用户,即你还没有登录。
    • 这是否意味着如果有 20 个 ajax 调用,每个调用都调用不同的 API 端点,那么所有这 20 个函数都必须将 ajax 请求包含在 auth.onStateChangedListener() 中?这不会让我的代码变得多余吗?
    • 嗨,我正在使用您更新答案中的相同代码,并且我得到了一个用户对象。在 if (user) 块内我 console.log 用户对象或 user.uid 并打印出用户或用户 id 但 user.getIdToken() 抛出错误:“user.getIdToken 不是函数”。我无法获取用户令牌 ID。也许你可以帮忙。谢谢!
    • 我使用的是 firebase 3.6.9。更新到 4.9.1 解决了这个问题!
    【解决方案2】:

    这是一个关于如何使用 NodeJS 获取 id 令牌的示例

    var firebase = require('firebase')
    firebase.initializeApp({
        apiKey:*********
        databaseURL:*********
    })
    
    var customToken = *********    
    firebase.auth().signInWithCustomToken(customToken).catch(function(error) {
        var errorMessage = error.message
        console.log(errorMessage)
    })
    
    firebase.auth().onAuthStateChanged(function(user) {
        if (user) {
            firebase.auth().currentUser.getToken().then(data => console.log(data))
        } else {
            console.log('onAuthStateChanged else')
        }
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2021-12-03
      相关资源
      最近更新 更多