如何在NextJS API Backend中使用授权?

des4xlb0  于 2023-04-20  发布在  其他
关注(0)|答案(1)|浏览(145)

我有工作的nextjs应用程序使用prisma作为ORM.我有这个页面:/somecats连接到nextjs后端(/pages/API/categories)。当我执行http://localhost:3000/api/requests时,它不需要授权。我希望这个端点应该被授权。我如何在NextJS中做到这一点,特别是用next-connect?
我试过this tutorial,但它不工作,仍然没有授权。
这是/pages/api/categories/index. js,现在仍然没有授权:

import { getCategories, postCategory } from '../../../database/controller';
import { verify } from 'jsonwebtoken';

const handler = nc({
    onError: (err, req, res, next) => {
        console.error(err.stack);
        return res.status(500).end(err);
    },
    onNoMatch: (req, res, next) => {
        return res.status(404).end("Page is not found");
    },
}).use((req, res, next) => {
    req.userId = null;
    req.username = null;

    const { authorization } = req.headers;

    if (!authorization) {
        next();
    } else {
        verify(authorization, 'khidir-secret', (error, decoded) => {
            if (!error && decoded) {
                req.userId = decoded.userId;
                req.username = decoded.name;
            }

            next();
        });
    }
})

    .get(async (req, res) => getCategories(req, res))
    .post(async (req, res) => postCategory(req, res))

export default handler;

也是这样做的:

//this is /lib/handler.ts
import { verify } from 'jsonwebtoken';
import { NextApiRequest, NextApiResponse } from 'next';
import nextConnect from 'next-connect';

export interface NextApiRequestExtended extends NextApiRequest {
  userId: number | null;
  username: string | null;
}

export default function getHandler() {
  return nextConnect<NextApiRequestExtended, NextApiResponse>({
  onError(error, req, res) {
    res.status(501).json({ error: `Sorry something Happened! ${error.message}` });
  },
  onNoMatch(req, res) {
    res.status(405).json({ error: `Method ${req.method} Not Allowed` });
  },
}).use((req, res, next) => {
  req.userId = null;
  req.username = null;

  const { authorization } = req.headers;

  if (!authorization) {
    next();
  } else {
    verify(authorization, 'khidir-secret', (error: any, decoded: any) => {
      if (!error && decoded) {
        req.userId = decoded.userId;
        req.username = decoded.name;
      }

      next();
    });
  }
})};

并使用以下命令调用该处理程序:

// this is version2 of /pages/api/categories.js
import { getCategories, postCategory } from '../../../database/controller';
import getHandler from '../../../lib/handler';

export default getHandler()
    .get(async (req, res) => getCategories(req, res))
    .post(async (req, res) => postCategory(req, res));

这两个密码都能用,但没有授权。我该怎么办?

o8x7eapl

o8x7eapl1#

您提供的代码已经在NextJS API后端使用了授权中间件。授权中间件从请求中提取授权头,并使用verify方法进行验证。如果授权头存在并验证成功,则会在req对象中设置userId和username属性。
要使用授权,您需要在向此API发出请求时传递带有有效令牌的授权头。例如,您可以使用fetch API发出带有授权头的请求,如下所示:

const token = 'valid_token_here';
fetch('/api/categories', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}`
  },
  body: JSON.stringify({ name: 'Category Name' })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));

在上面的例子中,Authorization头部设置了一个Bearer token,它与有效的token值串联在一起。这个token将由API后端的中间件进行验证,如果它是有效的,则将在req对象中设置userId和username属性。
注意:您提供的代码中没有定义中间件中使用的verify方法,需要从jsonwebtoken等库中导入才能使用。

相关问题