如何响应来自 Next.js api 路由中的授权中间件的请求?

假设我有以下 Next.js api 路由。

/api/protected-api

这个 api 将获得一个 authorization: "Bearer: TOKEN" 标头用于授权目的。

import { NextApiHandler } from "next";

const apiHandler: NextApiHandler = async (req,res) => {

  await runAuthMiddleware(req,res);

  // THE REST OF THE API LOGIC SHOULD ONLY RUN IF AUTHORIZATION SUCCEEDS
  // IN THEORY,runAuthMiddleware WOULD RESPOND WITH 403 IF AUTHORIZATION FAILS

  return res.json(data);

};

上面代码的意思是:

  • 如果授权失败,我想从 403 函数中响应 runAuthMiddleware,甚至不去运行 apiHandler 中的其余代码。

这甚至可能吗?这是一种反模式吗?

我应该用这样的东西代替吗?

const apiHandler: NextApiHandler = async (req,res) => {

  const authSuccess = await runAuthMiddleware(req,res);

  if (authSuccess)
    return res.json(data);
  else
    return res.status(403).send("Forbidden");

};

更新:

似乎没有简单的方法可以做到。该软件包提供了一种可能的解决方案:next-api-middleware

nanren41 回答:如何响应来自 Next.js api 路由中的授权中间件的请求?

如果这是您唯一需要的东西,有一种简单的方法可以做到这一点,只需创建自己的检查身份验证的高阶函数:

const withAuth = (f) => async (req,res) => {
  const isLogged = await checkIfUserIsLogged(req)

  if (isLogged) {
    return f(req,res)
  } else {
    return res.status(403).send("Forbidden");
  }
}

const apiHandler = withAuth(async (req,res) => {
  // This code now only runs of the user is logged
  return res.json(data);
});

对于更复杂的场景,我建议使用 https://github.com/hoangvvo/next-connect 或类似的东西。但是如果您只需要一个中间件,那么编写自己的中间件完全没问题。

本文链接:https://www.f2er.com/2757.html

大家都在问