【问题标题】:Flutter Firebase authentication - does User.getIdToken() query the server every time it's called?Flutter Firebase 身份验证 - User.getIdToken() 每次调用时都会查询服务器吗?
【发布时间】:2021-03-19 19:11:18
【问题描述】:

User.getIdToken()(带有参数forceRefresh = false)是否在每次调用时都从服务器检索 ID 令牌?或者它是否缓存它,并且仅在检测到刷新到期时才联系服务器(或完全执行其他操作)?

还有一个后续问题 - 如果它确实每次都从服务器检索 ID 令牌,这是否意味着每次应用程序想要向其后端服务器发送请求时(必须包含 ID令牌,以便后端可以验证请求的真实性),它实际上必须首先联系 Firebase 服务器以获取 ID 令牌?因为那会变得很贵,对吧?

我知道每当我获得新的User 实例时,我都可以收听idTokenChanges 流并缓存ID 令牌,但我宁愿不必这样做,因为我不想要@987654325 @ 在 ID 令牌更改时重建 UI。相反,收听authStateChanges 意味着 UI 只能在登录和注销事件时重建,这正是我想要的。但后来我遇到了上述潜在问题(如果确实每次都查询服务器),即每次我想向应用程序的后端发送请求时,我都必须调用getIdToken()

【问题讨论】:

    标签: firebase flutter firebase-authentication


    【解决方案1】:

    如官方documentationgetIdToken()所述:

    返回用于向 Firebase 服务识别用户的 JSON Web 令牌 (JWT)。 如果尚未过期,则返回当前令牌。否则,这将刷新令牌并返回一个新令牌。

    因此,只有在当前令牌过期时才能访问 Firebase 服务器。

    【讨论】:

    • 但是如何从服务器没有检索到 current token 来推断呢?你必须知道函数的实现细节?
    • JWT 令牌明确定义过期日期:github.com/auth0/node-jsonwebtoken/blob/master/…
    • 当然:作为一个 ID 令牌,我知道它会过期,所以我希望它有一个过期日期。但同样,我怎么能从中推断出没有从服务器检索到令牌?如果不看函数的内部结构,我怎么知道?说到内部;这是一个单行代码:return _delegate.getIdToken(forceRefresh);,而它又在 platform_interface_user.dart 中定义为 throw UnimplementedError("getIdToken() is not implemented");)。
    【解决方案2】:

    是否 User.getIdToken()(参数 forceRefresh = false)每次调用时都会从服务器检索 ID 令牌?

    没有

    或者它是否缓存它,并且仅在检测到刷新到期时才联系服务器(或完全执行其他操作)?

    如果不强制刷新,则无法保证它返回的值。它可能最近被刷新过,也可能没有。它只是返回最后一个已知值。

    如果它确实每次都从服务器检索 ID 令牌,这是否意味着每次应用程序想要向其后端服务器发送请求时(必须包含 ID 令牌,以便后端可以验证请求的真实性),它实际上必须首先联系 Firebase 服务器以获取 ID 令牌?

    不,您可以自行缓存该值并跟踪它的新鲜程度。

    老实说,如果您想优化您的代码,强烈建议您完全按照您说不想做的事情去做,并听取 SDK 将为您执行的自动刷新。这是始终拥有新令牌的推荐方式,也是 API 存在的全部原因。

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多