构建自定义认证流:Cloud Functions触发函数获取JWT附加声明
我来帮你拆解这些问题,结合Firebase Auth和触发器的实际工作机制逐一解答:
1. 能否在触发函数中获取相同的认证信息?
不行,至少默认情况下做不到。当你用自定义token调用signInWithCustomToken登录时,Firebase Auth只会验证token的签名和有效性,但不会自动将自定义token中的附加声明同步到用户的Firebase Auth记录里。而Firestore(或其他服务)的触发器中,auth对象里的claims仅来自Firebase Auth存储的customClaims(也就是你通过setCustomUserClaims设置的内容)。如果没调用这个方法,触发器里拿不到初始JWT中的附加声明。
2. 是否有计划或方法在服务器端通过getUser获取认证信息?
用Firebase Admin SDK的getUser方法只能获取到用户在Firebase Auth中持久化存储的customClaims,也就是你主动通过setCustomUserClaims设置的内容。初始自定义token里的附加声明不会自动被Firebase Auth保存,所以getUser拿不到这些信息。目前Firebase没有公开计划要让getUser自动读取初始自定义token中的附加声明——毕竟自定义token是你自己生成的,Firebase Auth只做验证,不负责存储额外的自定义数据。
3. 能否在触发函数(而非HTTPS或可调用函数)中从服务器获取IDToken?
不行。像Firestore触发器、Auth onCreate触发器这类事件驱动的函数,它们的上下文里没有提供用户完整的ID token字符串。Auth的onCreate触发器能拿到用户的uid和基础信息,但拿不到登录时的ID token;Firestore触发器的auth对象包含用户的uid、email等信息,但同样没有完整的ID token。如果必须要获取的话,只能让客户端在登录后把ID token写入Firestore文档,再让触发器读取,但这属于客户端传递,不是服务器端直接获取,还得注意安全校验。
4. 是否有计划支持使用自定义token创建认证用户时的onCreate触发器?
其实Auth的onCreate触发器本来就会在用户第一次用自定义token登录时触发(因为这时候会创建新的Firebase Auth用户),但问题是这个触发器里的user对象同样不包含初始自定义token中的附加声明。目前Firebase没有公开计划要让这个触发器直接获取自定义token里的附加声明。不过你可以换个思路:在生成自定义token的服务器端,把需要的附加声明同时写入一个临时存储(比如Firestore的临时集合或Realtime Database),然后在Auth的onCreate触发器里,根据uid读取这个临时数据,再完成Firestore的集合/文档填充。这样就能跳过客户端调用setCustomUserClaims的步骤了。
内容的提问来源于stack exchange,提问作者Domness

