如何在下一次身份验证中保护多个Next.js API路由

如何在下一次身份验证中保护多个Next.js API路由,next.js,next-auth,Next.js,Next Auth,我在Next.js中构建了一个简单的API,并使用Next auth进行身份验证 到目前为止,我必须在每个API路由中使用类似的内容: const session = await getSession({ req }); if (session) { ... do something ... } else { ... send back a 401 status } 这似乎违背了干燥原则。有没有一种聪明的方法可以将保护应用于一个地方的多个路由,例如Laravel

我在Next.js中构建了一个简单的API,并使用Next auth进行身份验证

到目前为止,我必须在每个API路由中使用类似的内容:

  const session = await getSession({ req });
  if (session) {
    ... do something ...
  } else {
    ... send back a 401 status
  }

这似乎违背了干燥原则。有没有一种聪明的方法可以将保护应用于一个地方的多个路由,例如Laravel路由组?

创建一个中间件,以获取会话返回401

请参阅上的NextJS文档。
您也可以在github repo中查看。

制作一个中间件

如果您不使用TS,请忽略键入

import { NextApiRequest, NextApiResponse } from 'next/types'
import { getSession } from 'next-auth/client'

export const protect = async (
  req: NextApiRequest,
  res: NextApiResponse,
  next: any
) => {
  const session = await getSession({ req })
  if (session) {
    console.log(session)
    next()
  } else {
    res.status(401)
    throw new Error('Not authorized')
  }
}

把它移到helper/util/middleware函数中,在API路由中调用它怎么样?这很好,但据我所知,我必须在每个API路由中引用中间件。在纯express应用程序中,我可以一次性定义一个覆盖多条路线的中间件。例如,使用passport时,未经授权的请求甚至不会传递到路由。在NextJS中可以这样做吗?我认为您必须在NextJS中包装每个需要中间件的处理程序。如果我没记错的话,NextJS中的每个api处理程序都是作为一个无服务器函数完全隔离运行的。如果您需要更多的控制,请阅读NextJS。也许可以添加全局中间件。