【问题标题】:How can I protect multiple Next.js API routes in next-auth如何在 next-auth 中保护多个 Next.js API 路由
【发布时间】:2021-05-14 06:23:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如何将其移至 helper/util/middleware 函数并在您的 API 路由中调用它?

标签: next.js next-auth


【解决方案1】:

做一个中间件!

如果您不使用 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')
  }
}

【讨论】:

    【解决方案2】:

    创建一个获取会话的中间件,否则返回 401。

    请参阅 api middleware 上的 NextJS 文档。
    你也可以在 github repo 中查看their example

    【讨论】:

    • 这很好,但据我了解,我必须在每个 API 路由中引用中间件。在一个纯 express 应用程序中,我可以一次性定义一个涵盖许多路由的中间件。例如,当使用护照时,未经授权的请求甚至不会传递给路由。 NextJS 中是否有可能发生这样的事情?
    • 我认为您必须在 nextjs 中包装您需要该中间件的每个处理程序。如果我没记错的话,NextJS 中的每个 api 处理程序都作为无服务器函数完全隔离运行。如果您需要更多控制,请阅读 NextJS 中的 creating your own server。或许可以添加全局中间件。
    猜你喜欢
    • 2021-08-06
    • 2022-10-16
    • 2022-11-14
    • 2021-02-20
    • 2021-10-27
    • 2020-02-04
    • 2022-07-24
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多