You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中使用Firebase认证SDK获取Token及存储、刷新Token遇阻求助

问题解决思路

你的代码存在两个核心问题,导致无法获取Token:

  1. return userCredential; 放在代码最前端,直接终止了后续逻辑执行,获取用户和Token的代码根本没运行。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:27:45