Firebase Admin SDK verifyIdToken为何能验证任意Firebase项目的Token?
为什么
FirebaseAuth.getInstance().verifyIdToken()可以验证所有Firebase项目的ID Token Firebase Admin SDK的verifyIdToken方法默认仅执行JWT的基础合法性校验,规则如下:
- 校验JWT签名是否匹配Google公开的签名公钥
- 校验JWT是否在有效期内
- 校验JWT的签发者
iss字段是否符合https://securetoken.google.com/<Firebase项目ID>的格式 - 校验JWT的受众
aud字段非空
默认逻辑不会校验aud/iss字段是否和当前Admin SDK配置的服务账号所属项目一致,只要是合法的Firebase签发的ID Token都能通过校验,属于设计正常行为。
如果需要限制仅当前项目的ID Token可通过验证,在调用verifyIdToken得到解析后的Token对象后,需要额外增加两层校验:
- Token的
aud字段必须等于你的后端关联的Firebase项目ID - Token的
iss字段必须等于https://securetoken.google.com/你的Firebase项目ID
不符合上述规则的Token直接判定为验证失败即可。
三个项目返回的JWT kid参数相同是否属于配置遗漏
不属于配置遗漏,属于正常现象。
kid是密钥ID,用于标识JWT签名使用的是Google公钥池中的哪一个密钥。所有Firebase项目的ID Token签名都复用Google统一维护的公共签名密钥池,不同项目签发的JWT如果恰好使用了同一个密钥进行签名,kid值就会完全一致。
不要使用kid作为JWT所属项目的判断依据,项目归属必须通过aud和iss字段校验实现。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

