如何使用下一个身份验证凭据提供程序刷新 firebase access_token?

问题描述 投票:0回答:1

我想知道如何在 Firebase 访问令牌过期时刷新它。我需要用于 api 身份验证的访问令牌。我尝试在网上找到它,但似乎找不到任何带有 next-auth 和 firebase 的内容。

这就是我现在所拥有的。我能够获取访问令牌,只是在过期时无法刷新。所以一段时间后我收到 api 身份验证错误。

import { auth } from "@/config/firebaseApp";
import { signInWithEmailAndPassword } from "firebase/auth";
import { AuthOptions } from "next-auth";
import NextAuth from "next-auth/next";
import CredentialsProvider from "next-auth/providers/credentials";

const authOptions: AuthOptions = {
  pages: {
    signIn: "/signIn",
  },
  session: {
    strategy: "jwt",
  },
  providers: [
    CredentialsProvider({
      type: "credentials",
      credentials: {},
      authorize: async (credentials): Promise<any> => {
        return await signInWithEmailAndPassword(
          auth,
          (credentials as any).email || "",
          (credentials as any).password || ""
        )
          .then(async (userCredentials) => {
            const dummy = {
              role: "admin",
            };

            if (userCredentials.user) {
              return {
                ...userCredentials.user,
                role: dummy.role || "user",
                access_token: await userCredentials.user.getIdToken(),
              };
            }
            return null;
          })
          .catch((err) => {
            console.log(err.message);
          });
      },
    }),
  ],

  callbacks: {
    async jwt({ token, user }) {
      if (user) {
        token.role = user.role;
        token.access_token = user.access_token;
      }
      return token;
    },

    async session({ session, token }) {
      if (session.user) {
        session.user.role = token.role;
      }

      return session;
    },
  },
};

const handler = NextAuth(authOptions);

export { handler as GET, handler as POST };

我也是初学者,所以如果我在这里做错了什么,请纠正我。

javascript firebase next.js firebase-authentication next-auth
1个回答
0
投票

firebaser在这里

Firebase 身份验证 SDK 在 ID 令牌过期前约 5 分钟自动刷新 ID 令牌,并且

getIdToken()
始终为您提供最新的令牌。由于 Firebase ID 令牌的有效期为一小时,因此您从
getIdToken
获取的令牌的有效期应至少为 5 分钟,最长为 60 分钟。

您可以将此令牌传递到您自己的后端以在那里验证它。您还可以在那里缓存令牌,但是您不应该将解码后的令牌与用户/UID相关联。

许多 Firebase 自己的无连接服务采用的方法:

  1. 始终在您从客户端进行的任何 API 调用中传递 ID 令牌。
  2. 在服务器上缓存编码的 ID 令牌和解码的值。
  3. 验证缓存中尚不存在的任何 ID 令牌,并缓存结果。
  4. 从缓存中删除超过一小时的项目。
© www.soinside.com 2019 - 2024. All rights reserved.