无法访问Next.js 12中间件中的NextAuth会话数据

jexiocij  于 2023-11-18  发布在  其他
关注(0)|答案(2)|浏览(100)

我尝试使用新的Next.js 12中间件功能实现路由保护。但我发现每次我尝试访问会话时都得到null。因此没有得到预期的结果。为什么?

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

//This acts like a middleware, will run every time for pages under /dashboard, also runs for the nested pages
const redirectUnauthenticatedUserMiddleware = async (req, ev) => {
     const session = await getSession({ req })
     if (!session) {
         return NextResponse.redirect('/login')
     }
    return NextResponse.next()
}

export default redirectUnauthenticatedUserMiddleware

字符串

gtlvzcf8

gtlvzcf81#

还有其他方法可以访问您的session
这里我们使用getToken from next-auth/jwt .来说明

  • 必须使用声明secret作为NextAuthfunction中的option(相关参考在此)。如果不是,它将不起作用。无论您使用session还是jwtoption。都将起作用。
export default NextAuth({
  secret: process.env.SECRET,
  ...otherOptions
})

字符串

  • 目前我不知道它是否会工作或不如果你不使用令牌.或者你只使用数据库选项.或适配器.我不确定,因为目前我无法使适配器工作只是.所以这.

下面是一个例子_middleware.js

import { getToken } from 'next-auth/jwt';
import { NextResponse } from 'next/server';

export async function middleware(req, ev) {
  // 'secret' should be the same 'process.env.SECRET' use in NextAuth function
  const session = await getToken({ req: req, secret: process.env.SECRET }); console.log('session in middleware: ', session)

  if(!session) return NextResponse.redirect('/')
  
  return NextResponse.next()
}


如果你已经找到了如何使用getSession的解决方案。你可以上传你的答案并与我们分享。谢谢。

ljsrvy3e

ljsrvy3e2#

上面的答案是正确的,对于那些想知道的人来说是有效的。useSession和getSession只在客户端工作,但nextjs中的中间件应用程序在服务器端,所以使用这两个不会工作或可能抛出错误。考虑使用getToken。你传递给getToken的secret也是你自己创建的secret,通常在env中命名为NEXTAUTH_SECRET

相关问题