如何通过OOBCODE获取Firebase的token及UID?
首先可以明确:仅通过OOB码调用applyActionCode无法直接获取到用户的uid和ID token,但可以通过搭配其他Firebase Auth接口实现你的需求:
具体实现逻辑
- 调用
checkActionCode接口提前获取用户uid
在执行applyActionCode完成验证前,先调用checkActionCode校验OOB码有效性,该接口返回的结果中会直接携带对应用户的uid、邮箱等核心信息。 - 完成邮箱验证后获取ID token
因为用户当前处于登出状态,没有有效登录态的情况下无法直接生成合法的Firebase ID token,有两种常用实现方案:
- 常规方案:验证完成后引导用户执行登录操作,登录成功后调用
user.getIdToken()即可获取有效token,用于调用你的自定义API。 - 免二次登录方案:在生成邮箱验证链接时,在自定义跳转路径中附加用户的邮箱等标识,验证完成后通过无密码登录(如邮箱链接登录、短信验证码登录)或其他静默登录方式完成用户登录,再获取token。
修改后的参考代码
if(router.query.oobCode) { const oobCode = router.query.oobCode let targetUserUid = null // 第一步:校验OOB码同时获取用户信息 firebase.auth().checkActionCode(oobCode) .then((actionCodeInfo) => { // 成功拿到对应用户的uid targetUserUid = actionCodeInfo.data.uid // 第二步:执行邮箱验证逻辑 return firebase.auth().applyActionCode(oobCode) }) .then(() => { setValidCode(true) setVerifiedCode(true) // 此处可插入登录逻辑,完成后获取IDtoken调用自定义API /* 登录后拿token的示例代码 firebase.auth().signInWithEmailAndPassword(userEmail, userPassword) .then(userCredential => userCredential.user.getIdToken()) .then(idToken => { // 携带uid和idToken调用你的自定义API }) */ }) .catch(error => { setError(error.message) setValidCode(false) setVerifiedCode(true) }) }
注意事项
- OOB码仅有一次有效使用机会,且存在有效期,调用
applyActionCode完成验证后该码会立即失效,因此必须在调用applyActionCode前执行checkActionCode获取用户信息。 - OOB码属于用户敏感凭证,不要传输给不可信的第三方服务,避免账号安全风险。
内容的提问来源于stack exchange,提问作者Prashant Patil
相关产品推荐
相关产品推荐

