Angular中使用Firebase认证SDK获取Token及存储、刷新Token遇阻求助
问题解决思路
你的代码存在两个核心问题,导致无法获取Token:
return userCredential;放在代码最前端,直接终止了后续逻辑执行,获取用户和Token的代码根本没运行。getIdTokenResult()是异步方法,返回的是Promise对象,不能直接赋值拿到Token值,需要等待异步操作完成。
另外,刷新令牌(Refresh Token)可以直接从userCredential.user.refreshToken同步获取,无需额外异步操作。
修正后的代码示例
方式1:使用async/await(更简洁易读)
async signIn() { try { const userCredential = await signInWithEmailAndPassword(auth, "email", "pwd"); const user = userCredential.user; // 获取包含ID Token的结果对象 const tokenResult = await user.getIdTokenResult(true); const idToken = tokenResult.token; // 直接获取Refresh Token const refreshToken = user.refreshToken; // 存储到本地存储 localStorage.setItem('idToken', idToken); localStorage.setItem('refreshToken', refreshToken); console.log('ID Token:', idToken); console.log('Refresh Token:', refreshToken); } catch (error) { const errorCode = (error as any).code; const errorMessage = (error as any).message; console.error('登录错误:', errorCode, errorMessage); } }
方式2:使用链式then
signInWithEmailAndPassword(auth, "email", "pwd") .then((userCredential) => { const user = userCredential.user; const refreshToken = user.refreshToken; // 异步获取ID Token return user.getIdTokenResult(true).then(tokenResult => { const idToken = tokenResult.token; localStorage.setItem('idToken', idToken); localStorage.setItem('refreshToken', refreshToken); console.log('ID Token:', idToken); console.log('Refresh Token:', refreshToken); }); }) .catch((error) => { const errorCode = error.code; const errorMessage = error.message; console.error('登录错误:', errorCode, errorMessage); });
刷新Token功能补充
后续实现Token刷新时,可调用user.getIdToken(true)(该方法直接返回ID Token的Promise),当当前Token过期时,Firebase会自动使用Refresh Token刷新并返回新的ID Token,手动刷新示例:
async refreshIdToken(user: User) { const newIdToken = await user.getIdToken(true); localStorage.setItem('idToken', newIdToken); return newIdToken; }
内容的提问来源于stack exchange,提问作者flavio
相关产品推荐
相关产品推荐

