Firebase Cloud Functions:检查已撤销的令牌

Firebase Cloud Functions: check for revoked token

我正在尝试使用声明在 firebase 中创建管理角色,并在 Cloud Functions 环境中检查 onCall 方法中的角色。我假设 context.auth.token 会被验证,但似乎用户从管理员更改为普通用户(或对用户进行任何其他编辑,使用 admin.auth().revokeRefreshTokens(uid) 撤销身份验证令牌) 实际上并没有立即撤销权限,或者编辑用户在随后的 onCall 上未验证令牌:

export const someFunction = functions.https.onCall((data, context) => {
  const isAdmin = context.auth?.token.admin === true
  ...
}):

导致 isAdmin 在撤销用户令牌(并将 admin 设置为 false)后仍然为真。

检查这个的合适方法是什么?我尝试手动验证 context.instanceIdToken,但未(始终)设置。我拨打的所有电话都已登录。

如有指点,我们将不胜感激。如您所知,'revoking admin access' 通常是一个应该立即执行的操作。

您的令牌中的 admin 是自定义声明,客户端将其作为其 ID 令牌的一部分与每个请求一起发送到 Cloud Functions。客户端上的 ID 令牌每小时刷新一次。因此,在您 add/remove 自定义声明之后,客户最多可能需要一个小时才能收到它,并将其传递给 Cloud Functions。

生成 ID 令牌时,它会获得一个过期时间戳。在该时间戳过去之前,ID 令牌被假定为有效。由于 Firebase 的 ID 令牌通常在一小时内有效,因此在您对基础用户配置文件进行更改后,它们最多仍可使用一小时。

您可以强制客户端在此之前刷新其 ID 令牌,方法是调用 getIDToken(true) API (Android link, but other platforms have a similar API). Also see the section in the documentation on propagating custom claims to the client。但这取决于客户端,所以不好足够安全。

为确保更新后的令牌不再可用,您需要创建此类 "revoked" 令牌的列表。然后让您的 Cloud Functions 检查已撤销令牌的列表,如果令牌已在那里失效,则拒绝请求。有关此示例,请参阅 detecting ID token revocation.

上的 Firebase 文档中的示例