我已经使用nextAuth和Next js 4.23.1创建了一个会话,并且它可以工作,但是我不知道如何在我的中间件中获取会话或令牌,我try 将处理程序传递给getSession()并执行任何工作.

我可以通过useSession在任何Use CLINTE组件中获取会话

我如何在服务器端获得会话和/或令牌,谢谢您的帮助

in api/auth/[..nextauth]/route

import NextAuth from "next-auth"
import CredentialsProvider from "next-auth/providers/credentials"
import { _AUTH } from "@/app/services/shared/endpoints";

export const handler = NextAuth({
    session: {
      strategy: 'jwt'
    },

    providers: [
      CredentialsProvider({
        async authorize(credentials, req){
            const res  = await fetch(_AUTH._AUTH_LOGIN, {
                method: 'POST',
                body: JSON.stringify({user:{...credentials}}),
                headers: { "Content-Type": "application/json" }
            })
               const user = await res.json()
               if (!user) {
                  return
                } else {
                  return user
                }
            }
        })
    ],
      pages: {
        signIn: '/login',
      }
})
  
export { handler as GET, handler as POST }

middleware

import { handler } from "./app/api/auth/[...nextauth]/route"
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
import { getSession } from "next-auth/react"


export async function middleware(request: NextRequest) {

    const session = await getSession(handler)

    if(session !== undefined || session !== null){
        return NextResponse.redirect(new URL('/empresa/mis-empresas', request.url))
    }
}
 
export const config = {
  matcher: [
    '/empresa/mis-empresas',
  ]
}

推荐答案

要在服务器端获得会话,不应该直接try 将NextAuth处理程序传递给getSession.GetSession函数也可以在服务器端工作,但您需要将请求对象传递给它.

import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
import { getSession } from "next-auth/react"

export async function middleware(request: NextRequest) {
    const session = await getSession({ req: request });

    if(session){
        return NextResponse.redirect('/empresa/mis-empresas')
    }
}

GetSession接受一个应该包含req属性的对象,该属性表示请求.我删除了您的if语句中不必要的比较.判断(会话)是否足以确定是否存在有效的会话.确保您的中间件已正确配置和执行.Middleware是Next.js12中的新增功能,因此您可能需要参考Next.js文档以确保正确设置它.

Reactjs相关问答推荐

过滤对象数组并通过迭代对象数组将属性放入新数组

如何防止使用useCallback和memo重新渲染

FireBase未与Reaction应用程序连接

无法将react 路由状态从路由传递给子组件

在REACT-RUTER-DOMV6中使用通用页面包装组件有问题吗?

如何使ionic 面包屑在州政府条件下可点击?

在React中使用映射创建flex组件

当我无法引用模态组件时,如何使模态组件在 Next.js/React 中管理自己的状态?

无法使用 Suspense 和 Await 获取数据

无法使用 MongoDB Atlas 和 Next.js 删除正确的帖子

我可以在加载器函数中多次 fetch() 并使用一次 useloaderdata() 提取它吗?

BrowserRouter改变了URL但没有链接到页面

无法读取未定义的属性(读取值)...TypeError:无法读取未定义的属性(读取值)

为什么 createSlice 中的 reducer 不能以不同的方式改变状态?

Redux Toolkit 配置,是否适用于全栈应用程序?

React:如何设置光标 Select

如果传递给挂钩的数据需要事先修改,如何使用自定义挂钩?

Wordpress 插件在激活时创建一个 React Public 页面

使用 yarn 编译 protobuf js 时出现错误pbjs: command not found

警告:您在没有 `onChange` 处理程序的情况下为表单字段提供了 `value` 属性