Firebase Admin SDK 库提供了生成自定义 JSON Web 令牌 (JWT) 以对用户进行身份验证的功能。生成的 JWT 过期时间固定为 60 分钟,Firebase 不允许过期时间超过 60 分钟的令牌。

但是我们如何生成自定义过期时间小于 60 分钟的令牌呢?让我们谈谈一个可行的计划。

Firebase JWT 剖析

您可以解码任何 JWT 并查看内容,这已经不是什么秘密了。

在JWT上试用

通过查看令牌的解码内容,我们可以识别负责跟踪到期时间的有效负载属性。特别是iat- (issued-at-time) 和exp- (expiration time) 是跟踪自 UNIX 纪元以来以秒为单位的初始化和过期时间的键。

firebase-jwt-anatomy.png

让我们破解它

用于创建自定义令牌的官方 Admin SDK 函数接受三个参数。这里developer_claimstenant_id是可选的。developer_claims是一个字典,它接受要在生成的 JWT 中编码的附加数据。

create_custom_token(self, uid, developer_claims, tenant_id)

我尝试通过传递相同的字典键iatexp来调整官方 Admin SDK 功能以创建具有自定义到期时间的自定义令牌,假设这将替换内部生成的到期值。

 custom_token = auth.create_custom_token('12345', {'iat': 48784, 'exp': 83733})

但结果根本没有成功。官方 Admin SDK 限制返回错误。

ValueError: Developer claims iat, exp are reserved and cannot be specified.

体面的方式

所以调整没有按预期工作。 Firebase Admin SDK 无法做到这一点。但 Firebase 文档建议使用第三方 JWT 库,以防没有官方支持的特定编程语言的 Admin SDK。

尽管这是依赖第三方 JWT 库来生成自定义身份验证令牌的初衷。我们可以使用它来创建具有自定义过期时间的 JWT。所以在这里,我们利用 Python 中的PyJWT库从头开始生成令牌。

import jwt
import time

TOKEN_EXPIRATION_TIME_IN_MINUTES = 2

user_id = 'XXXXXXXXX'

# Refer your admin SDK credential JSON file to replace below values
service_account_email = "firebase-adminsdk-**@***.iam.gserviceaccount.com"
private_key = b"-----BEGIN PRIVATE KEY-----\n*****"

# Current time in seconds
current_time = int(time.time())

payload = {
     'iss': service_account_email,
     'sub': service_account_email,
     'aud': "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
     'iat': current_time,
     'exp': current_time + (TOKEN_EXPIRATION_TIME_IN_MINUTES*60),
     'uid': user_id
}

encoded_token = jwt.encode(payload, private_key, algorithm="RS256")

# Tokens are created as a binary. Decoding with utf-8 will convert it to a String 
jwt_token = encoded.decode("utf-8")

令牌刷新

Firebase 令牌的创建期限最长为 60 分钟。您可能想知道令牌到期后会发生什么。你应该担心吗?

在一般场景下,短寿命的授权令牌与长寿命的刷新令牌相关联,以在授权令牌过期时交换新的授权令牌。因此,我们应该担心在过期时获取新身份验证令牌的机制。

但是,Firebase 客户端 SDK 将在内部处理此令牌交换,并让您无限期地保持登录状态,直到调用signout。因此,即使是通过第三方 JWT 库生成的自定义令牌,也无需担心令牌管理。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐