Next.js & RTK查询-检查每个页面上的用户身份验证

tp5buhyn  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(132)

bounty将在19小时后过期。回答此问题可获得+300声望奖励。Ruby正在寻找标准答案:需要一个使用Next.js和RTK查询检查用户是否在每个页面上登录的示例

我正在使用RTK Query with Next.js,我想检查用户是否登录,以更改标题布局和标题文本以及其他可能的内容,如果不使用getInitialProps,我应该如何完成?
Next.js不推荐使用getInitialProps,因为它对性能不理想,但是,推荐的方法getServerSideProps_app.tsx级别上不起作用。
我想使用NextAuth,但我不知道如何在使用RTK Query时做到这一点,而且我找不到任何示例。
如果有人能给我指出正确的方向或最佳的工作流程,用RTK查询在Next.js的每个页面上验证用户,那就太好了。

wfveoks0

wfveoks01#

为了获取用户是否经过身份验证,用户向端点发出请求,在next.js中,您可以在构建rest-api代码的api目录中定义此请求。

import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";

export const authApi = createApi({
  reducerPath: "authApi",
  baseQuery: fetchBaseQuery({
    baseUrl: "http://localhost:300/",
  }),
  // builder is an object that has mutation and query
  endpoints: (builder) => {
    console.log("builder", builder);
    return {
      // we are making post that is wht it is mutation. otherwise it would be query
      fetchUser: builder.query({
         query:()=> "/api/user"
      }),
 ....

 export const {usefetchUserQuery,otherQueriesOrMutations} = authenticationApi;

然后将其注册到store.js

export const store = configureStore({
  reducer: {
    // assuming you already set the slices of the app
     auth: authReducer,
    [authenticationApi.reducerPath]: contactsApi.reducer,
  },
  // userAPI is the middleware that we hook in store which enables caching, invalidation, polling, and other useful features of `rtk-query`
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware().concat(authenticationApi.middleware),
});

api/user中,根据您的身份验证逻辑返回if user或not。如果使用next-auth

import { getSession } from "next-auth/client"

export default async (req, res) => {
  const session = await getSession({ req })
   ... 
  res.sned(true)
}

我假设您已经设置了身份验证逻辑,或者您可能已经使用了基于令牌的身份验证

const token = req ? req.cookies?.token : null;
   res.send(token)

基本上,这将是您检查用户的中心点。
因为您需要header组件的用户,所以在Header组件的useEffect中,您可以调度一个操作来检查用户是否通过了身份验证。或者,您可以设置SessionProvider,以便可以在header组件中挂接useSession

// signIn for signing click, signOut is for signing out click
   import { signIn, signOut, useSession } from "next-auth/react"

   const { data: session, status } = useSession()
   const loading = status === 'loading'

如果希望从服务器端属性获取用户,则必须将用户属性钻取到header组件。

相关问题