【问题标题】:NextJS cookie token not being detected in getServerSideProps在 getServerSideProps 中未检测到 NextJS cookie 令牌
【发布时间】:2021-05-05 05:39:11
【问题描述】:

我一直在学习关于设置 NextJS、firebase 和 react-context 以处理用户身份验证的非常不错的教程。一切都很顺利,直到,嗯......我的getServerSideProps 中的代码无法找到 cookie 'token',这导致我的 firebase 查询失败,触发我重定向到登录页面。

所以,简而言之,我可以登录/注销用户并设置 cookie 令牌。但是,当我转到 SSR 检查令牌的页面时,它什么也没找到,而是触发了我的重定向。

我正在使用的 SSR + cookie 资源:https://colinhacks.com/essays/nextjs-firebase-authentication

页面 SSR 请求

export const getServerSideProps = async (ctx: GetServerSidePropsContext) => {

  try {
    const cookies = nookies.get(ctx);
    console.log("cookies token", cookies.token); // returns empty string :(

    const token = await firebaseAdmin.auth().verifyIdToken(cookies.token);
    // * the user is authenticated

    const { uid, email } = token;
    // ! stuff would be fetched here

  } catch (error) {
    // either the `token` cookie doesn't exist
    // or the token verification failed
    // either way: redirect to login page

    return {
      redirect: {
        permanent: false,
        destination: "/auth/login",
      },
      props: {} as never,
    };
  }

  return {
    props: { data, params: ctx.params },
  };
};

上下文 + 我设置 cookie 的位置

export const AuthContext = createContext<{ user: firebase.User | null }>({
  user: null,
});

export function AuthProvider({ children }: any) {
  const [user, setUser] = useState<firebase.User | null>(null);

  useEffect(() => {
    if (typeof window !== "undefined") {
      (window as any).nookies = nookies;
    }
    return firebaseAuth.onIdTokenChanged(async (user) => {
      console.log(`token changed!`);
      if (!user) {
        console.log(`no token found...`);
        setUser(null);
        nookies.destroy(null, "token");
        nookies.set(null, "token", "", {});
        return;
      }

      console.log(`updating token...`);
      const token = await user.getIdToken();
      // console.log("got user token:", token);
      // console.log("got user:", user);
      setUser(user);
      nookies.destroy(null, "token");
      nookies.set(null, "token", token, {});
    });
  }, []);

  // force token refresh every 10 minutes
  useEffect(() => {
    const handle = setInterval(async () => {
      const user = firebaseAuth.currentUser;
      if (user) await user.getIdToken(true);
    }, 10 * 60 * 1000);

    // clean up
    return () => clearInterval(handle);
  }, []);

  return (
    <AuthContext.Provider value={{ user }}>{children}</AuthContext.Provider>
  );
}

【问题讨论】:

  • 我有一个项目,我使用js-cookie 设置cookies 和nookies 在serverSideProps 中获取cookies
  • 这很有趣,经过多年的故障排除,我最终还是做了同样的事情,哈哈

标签: reactjs firebase cookies next.js


【解决方案1】:

解决了。我在这里发布了我对这个问题的答案:https://github.com/maticzav/nookies/issues/255

【讨论】:

  • 这在生产中也有效吗?你也在哪里部署它。我可以在开发模式下获取 cookie。当我将它投入生产时,cookie 是未定义的。我正在使用 firebase 云功能为网站提供服务
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 2021-05-15
  • 2021-05-12
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2020-07-25
相关资源
最近更新 更多