【问题标题】:How can I respond the request from an authorization middleware in a Next.js api route?如何响应来自 Next.js api 路由中的授权中间件的请求?
【发布时间】:2021-10-07 01:21:46
【问题描述】:

假设我有以下 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);

};

我上面的代码的意思是:

  • 如果授权失败,我想从runAuthMiddleware 函数响应403,甚至不用费心运行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

【问题讨论】:

    标签: node.js authentication next.js middleware


    【解决方案1】:

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

    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 或类似的东西。但是,如果您只需要一个中间件,那么您自己编写是完全可以的。

    【讨论】:

      猜你喜欢
      • 2021-09-02
      • 2021-08-12
      • 2018-02-23
      • 2021-04-02
      • 1970-01-01
      • 2022-06-29
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      相关资源
      最近更新 更多