我有工作的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));
这两个密码都能用,但没有授权。我该怎么办?
1条答案
按热度按时间o8x7eapl1#
您提供的代码已经在NextJS API后端使用了授权中间件。授权中间件从请求中提取授权头,并使用verify方法进行验证。如果授权头存在并验证成功,则会在req对象中设置userId和username属性。
要使用授权,您需要在向此API发出请求时传递带有有效令牌的授权头。例如,您可以使用fetch API发出带有授权头的请求,如下所示:
在上面的例子中,Authorization头部设置了一个Bearer token,它与有效的token值串联在一起。这个token将由API后端的中间件进行验证,如果它是有效的,则将在req对象中设置userId和username属性。
注意:您提供的代码中没有定义中间件中使用的verify方法,需要从jsonwebtoken等库中导入才能使用。