刷新 firebase id 令牌服务器端

2024-02-25

我正在开发一个使用 Next.js 13 和带有 id 令牌的 firebase auth 的应用程序。

我想利用服务器端组件的 Next.JS 内置功能来更快地获取用户数据,因此我需要在初始请求时验证服务器上的 id 令牌。当没有用户登录受保护的路由时,我想重定向到登录页面。

当用户处于非活动状态超过 1 小时并且 id 令牌已过期时,就会出现问题。下一个请求标头将发​​送过期的令牌,导致auth.verifyIdToken拒绝它。这将在任何客户端代码有机会运行之前将用户重定向到登录页面,包括user.getIdToken刷新令牌。

有没有办法在服务器端刷新 id 令牌?我读here https://stackoverflow.com/questions/73686177/how-to-refresh-firebase-token-from-back-end-using-node-js/73686213?noredirect=1#comment132982792_73686213,有一个使用 firebase REST API 的解决方法,这似乎不安全。

Context

I use the `firebaseui` [package][2] for login, which creates the initial id token & refresh token. Then I have an `AuthContextProvider` to provide & refresh the id token on the client:
const ServerAuthContextProvider = ({
  children,
  user,
  cookie,
}: {
  children: ReactNode;
  user: UserRecord;
  cookie: Cookie;
}) => {
  useEffect(() => {
    if (typeof window !== "undefined") {
      (window as any).cookie = cookie;
    }
    return auth.onIdTokenChanged(async (snap) => {
      if (!snap) {
        cookie.remove("__session");
        cookie.set("__session", "", { path: "/" });
        return;
      }
      const token = await snap.getIdToken();
      cookie.remove("__session");
      cookie.set("__session", token, { path: "/" });
    });
  }, [cookie]);

  return (
    <serverAuthContext.Provider
      value={{
        user,
        auth,
      }}
    >
      {children}
    </serverAuthContext.Provider>
  );
};
  );
};

服务器端根组件

const RootLayout = async ({ children }: { children: React.ReactNode }) => {
  const { user } = await verifyAuthToken();
  if (!user) redirect("/login");

  return (
    <html lang="en">
      <body>
        <ServerAuthContextProvider user={user}>
          {children}
        </ServerAuthContextProvider>
      </body>
    </html>
  );
};

服务器端令牌验证

const verifyAuthToken = async () => {
  const auth = getAuth(firebaseAdmin);

  try {
    const session = cookies().get("__session");
    if (session?.value) {
      console.log("found token");
      const token = await auth.verifyIdToken(session.value);
      const { uid } = token;
      console.log("uid found: ", uid);
      const user = await auth.getUser(uid);
      return {
        auth,
        user,
      };
    }
  } catch (error: unknown) {
    if (typeof error === "string") {
      console.log("error", error);
      return {
        auth,
        error,
      };
    } else if (error instanceof Error) {
      console.log("error", error.message);

      return {
        auth,
        error: error.message,
      };
    }
  }
  return {
    auth,
  };
};

对于 SSR 应用程序,您应该使用会话cookie https://firebase.google.com/docs/auth/admin/manage-cookies。与 ID 令牌不同,它们不会在 1 小时内过期,您可以将它们配置为最长有效 14 天。
当用户使用 Firebase 客户端 SDK 登录时,您可以使用getIdToken()一次并向其传递一个 API,该 API 生成并设置可在后续请求中读取的会话 cookie。 这样您就不必使用侦听器来更新令牌。

请确保通过设置从客户端 SDK 注销用户身份验证持久性 https://firebase.google.com/docs/auth/web/auth-state-persistence to none或者显式注销用户,这样万一您清除了他们的 cookie(使用注销 API),客户端就没有用户了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

刷新 firebase id 令牌服务器端 的相关文章

随机推荐

  • 使用 iOS6 社交框架将视频上传到 Facebook

    我想将视频文件发布到 Facebook 之前我使用过Facebook iOS SDK3 0 它可以工作 然而 对于iOS6 Social Framework 存在问题 block ACAccount facebookAccount ACAc
  • 强制布局(),请求布局()

    我对android文档的阅读发现了方法forceLayout 用于在下一个布局请求时生成布局显示 和requestLayout 应该立即发布布局请求 但我无法让它们表现出来正如广告所言 特别是 如果我在 Thread Sleep 之前设置一
  • Firebase 允许用户使用密钥进行访问

    我想通过电子邮件向用户发送一个提交反馈的链接 该链接具有每个用户唯一的访问密钥 如果访问密钥有效 用户应该能够提交 这在 Firebase 上怎么可能 最简单的方法是 为每个用户生成密钥 已创建一个 可能为空 文档 并将密钥作为文档 ID
  • Django Rest Framework:在 ViewSet 中注册多个序列化器

    我正在尝试创建一个自定义 API 不使用模型 但它没有在架构中显示请求定义 因此 没有以 swagger 的方式显示它 我当前的代码是 views py class InfoViewSet viewsets ViewSet list rou
  • 如何修复 InnoDB 表?

    昨晚我们的 Solaris MySQL 数据库引擎 显然 执行得很差 至少有一些 InnoDB 表已损坏 事务日志中出现时间戳无序错误 以及有关索引损坏的特定错误 我们知道可用于 MyISAM 表修复的工具 但找不到任何适用于 InnoDB
  • Python:手动输入运行shell脚本

    例如 shell 脚本在提示符处获取一个整数并返回它 Enter an integer gt 3 3 我在用着subprocess check call myScript 运行 shell 脚本 我怎样才能自动发送 3 如上例所示 到目前为
  • 为什么java需要双等号?

    为什么java在比较整数时需要双等号 if陈述 例如 if x 3 141 System out println x is equal to pi 不正确 应该是 if x 3 141 System out println x is equ
  • 如何使用 matlab 正确地细分细胞图像?

    I have the following picture which is a photo of pancreatic cells 我想做的是能够获得每个细胞的膜 红色丝 然后进行镶嵌以了解丝的长度 到目前为止 我已经尝试使用matlab网
  • 如何正确地将文本宽度设置为图表条上方中心标签?

    我目前有一个图表 每个条形上方显示有关联的条形值 但由于无法获取每个文本元素的宽度 因此我很难将值标签居中 这就是我目前绘制的图表的方式 我需要做的就是减去每个文本元素宽度的一半 但我似乎无法使用以下 Coffeescript 来做到这一点
  • 使用 AVFoundation 录制具有自定义尺寸的视频? [复制]

    这个问题在这里已经有答案了 我正在使用 AVFoundation 录制 MOV 文件 但我无法找到如何更改视频的尺寸 我有videoGravity的财产captureVideoPreviewLayer set to AVLayerVideo
  • 核心图和 NSDate (iPhone)

    我希望绘制一个折线图 其中 x 轴定义为两个日期之间的天数 y 轴是每天变化的值 我可以将 y 值绘制为 NSNumber 但我不知道如何在 x 轴上设置范围和标记 我查看了 core plot 发行版的 examples 目录中的日期示例
  • 像 FireBug 一样获取 PostData

    任何人 帮助我 如何使用 xpcom 其他东西获取扩展内的 headers 和 PostData 我无法在 firebug 中找到函数 因为它的代码库很大 谢谢你们 我假设您需要请求标头 而不是响应标头 然后你注册一个观察者http on
  • 在 C 中返回错误的 MD5 哈希值

    我正在尝试为字符串生成 MD5 哈希值 你好世界 使用原始 未修改的 md5 h 和md5c c http www arp harvard edu eng das manuals QNX6libs md5c 8c source html f
  • Tizen WEB 应用程序在 2.2 版本中无法运行

    我是 Tizen 的新手 并通过在 64 位 Windows 7 计算机中将 SDK 版本设置为 2 2 来开始开发 我创建了一个新的 WEB 应用程序 在尝试运行它 在模拟器和真实设备上 时 安装后没有任何反应 我尝试了几次启动该应用程序
  • Windows 上 PyCharm 中 numpy 的安装

    当我尝试在 Pycharm Windows 中安装 numpy 时 我不断收到错误 这是我得到的错误 C Python27 lib distutils dist py 267 UserWarning 未知的分发选项 define macro
  • cmd.exe 的 CSS 字体系列

    我在CSS中找不到任何与CMD exe中使用的字体系列类似的字体系列 请你帮助我好吗 您可以使用 font family monospace 指定您希望使用等宽字体 控制台使用等宽字体以确保所有字符具有相同的宽度 请注意 某些浏览器无法正确
  • 如何访问在条件匹配组 Javascript 正则表达式中导致匹配的表达式?

    我有一个条件匹配分组正则表达式 例如 sun bmoon 当我访问字符串中的匹配项时 我希望能够看到导致匹配的表达式 let regex sun bmoon let match regex exec moon return bmoon 这可
  • 通俗地说,Java 中的“静态”是什么意思? [复制]

    这个问题在这里已经有答案了 我被告知了它的几个定义 查看了维基百科 但作为 Java 的初学者 我仍然不确定它的含义 有人精通 Java 吗 static 意味着标记为此类的变量或方法在类级别可用 换句话说 您不需要创建该类的实例来访问它
  • 如何使用 RefersToRange?

    谁能告诉我如何在vba中使用RefersToRange 以及什么时候需要它 请先提供简单的例子 提前致谢 在Excel中 有一个概念 命名范围 这是一个带有名称的单元格范围 这由Name https msdn microsoft com e
  • 刷新 firebase id 令牌服务器端

    我正在开发一个使用 Next js 13 和带有 id 令牌的 firebase auth 的应用程序 我想利用服务器端组件的 Next JS 内置功能来更快地获取用户数据 因此我需要在初始请求时验证服务器上的 id 令牌 当没有用户登录受