我正在使用NextJS进行服务器端呈现,我想保护一些“管理”页面,在这些页面上我可以对我的DB执行CRUD操作。
我成功地在我的网站上添加了身份验证(使用护照和next-connect,遵循本教程:https://hoangvvo.com/blog/next-js-and-mongodb-app-1)。
但现在我希望能够避免任何“编辑”操作,如果用户没有身份验证。
我觉得执行此操作的最佳方法是检查req.user是否存在于我的/page/API文件中。但这不管用。目前,req.user未定义。但当我正确登录时,饼干就会存储在我的电脑上。
我在stakoverflow上见过很多这样的问题。但只有少数与Nextjs相关。他们都没有解决我的问题(也许是因为我是JS和认证方面的新手)
当我从auth req.user存在登录并在我的计算机上获得cookie时:
/pages/api/auth
req.user => OK
import nextConnect from 'next-connect';
import middleware from '../../middleware/middleware';
import passport from '../../lib/passport';
import { extractUser } from '../../lib/api-helpers';
const handler = nextConnect();
handler.use(middleware);
handler.post(passport.authenticate('local'), (req, res) => {
res.json({ user: extractUser(req.user) });
console.log(req.user) // IT WORKS
});
export default handler;但是,如果我登录并通过任何API获取数据,则req.user是未定义的。
我的一个API文件的示例:
/page/api/getList.js
import nextConnect from 'next-connect';
import middleware from '../../middleware/middleware';
const handler = nextConnect();
handler.use(middleware);
handler.post(async (req, res) => {
console.log(req.user) // UNDEFINED
// do something if req.user exist
});
export default handler;-如果需要的话
我的会话中间件:
中间件/session.js
import session from 'express-session';
import connectMongo from 'connect-mongo';
import * as uuid from 'uuid';
const MongoStore = connectMongo(session);
export default function sessionMiddleware(req, res, next) {
const mongoStore = new MongoStore({
client: req.dbClient,
stringify: false,
});
return session({
secret: "this gonna rocks !",
store: mongoStore,
resave: true,
saveUninitialized: true,
cookie: {
maxAge: (1000 * 60 * 100)
}
})(req, res, next);
}我的常用中间件:
import nextConnect from 'next-connect';
import passport from 'passport';
import database from './database';
import session from './session';
const middleware = nextConnect();
middleware
.use(database)
.use(session)
.use(passport.initialize()) // passport middleware handles authenthentication, which populates req.user
.use(passport.session());
export default middleware;我不知道我做错了什么。有人能告诉我在对DB进行任何操作之前,如何检查用户是否经过身份验证吗?
非常感谢!
发布于 2022-04-12 10:42:16
我也面临着同样的问题,我找到的解决办法是:
const中间件=(处理程序) =>异步(req,res) =>{ //中间件函数此处//代码工作返回(res.send(数据),处理程序(req,res));//错误返回res.send(“错误”),处理程序(req,res) }
处理程序文件或api文件中的
const处理程序= (req,res)=>{ //此处的代码} //如何导出多个中间件导出默认的=>
。
我试着用简单的方式解释我希望这会对你有所帮助。如果没有,请告诉我。
https://stackoverflow.com/questions/65348127
复制相似问题