通过检查保存在用户 cookie 中的 JWT 来保护路由

Protected Route by checking JWT saved in user's cookie

我刚刚在 this blog post 之后的 NextJS + DjangoRest 项目中实现了 Google 社交身份验证。我正在尝试弄清楚如何制作受保护的路由,以便在用户未登录时重定向用户。

到目前为止我是这样做的:

明显的问题是每当用户刷新页面时 UserContext 都会重置,即使 JWT 令牌仍然存在于 cookie 中也是如此。我觉得这不是实现它的正确方法。

那么我将如何以一种非 hacky 的方式实现类似的功能?我无法从前端的 cookie 中读取 jwt-token,因为它是 httponly。是否有安全的方法从 cookie 中读取用户的 JWT 令牌以测试身份验证?

因此,如果我没看错你的问题,那么你可以在你的页面上使用 getServerSide 属性来检测用户是否通过你的 api.

认证
function Page({ isAuth }) {
    return (
    <>
      <div>My secure page</div>
      //if you return data from your token check api then you could do something like this
      <div>Welcome back {isAuth.name}</div>
    </>
    )
}

export default Page



export async function getServerSideProps(context) {
    const isAuth = await tokenChecker(context.cookies.jwt) // In your token checker function you can just return data or false.
    if (!isAuth) { //if tokenChecker returns false then redirect the user to where you want them to go
        return {
            redirect: {
                destination: `/login`,
            }
        };
    }
//else return the page
    return {
        props: {
            isAuth,
        },
    }
}

如果这不是你的意思,请告诉我,我可以修改我的答案。

我稍微修改了@Matt 的回答,typescript-friendly 解决了我的问题。它只是检查用户的 cookie 中是否有 jwt_token 值。

import cookies from 'cookies'

export const getServerSideProps = async ({
  req,
}: {
  req: { headers: { cookie: any } };
}) => {
  function parseCookies(req: { headers: { cookie: any } }) {
    var parsedCookie = cookie.parse(
      req ? req.headers.cookie || '' : document.cookie
    );
    return parsedCookie.jwt_token;
  }

  const isAuth = parseCookies(req);

  if (typeof isAuth === undefined) {
    return {
      redirect: {
        destination: `/auth/sign_in`,
      },
    };
  }
  return {
    props: {
      isAuth,
    },
  };
};