首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NextJS和Passport保护API路由: req.user未定义

使用NextJS和Passport保护API路由: req.user未定义
EN

Stack Overflow用户
提问于 2020-12-17 20:48:10
回答 1查看 829关注 0票数 1

我正在使用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

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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);
    }

我的常用中间件:

代码语言:javascript
复制
    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进行任何操作之前,如何检查用户是否经过身份验证吗?

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2022-04-12 10:42:16

我也面临着同样的问题,我找到的解决办法是:

  1. 创建一个中间件函数,并确保当它碰到错误或响应时,它应该返回处理程序。比如:

const中间件=(处理程序) =>异步(req,res) =>{ //中间件函数此处//代码工作返回(res.send(数据),处理程序(req,res));//错误返回res.send(“错误”),处理程序(req,res) }

处理程序文件或api文件中的

const处理程序= (req,res)=>{ //此处的代码} //如何导出多个中间件导出默认的=>

  1. 确保在connectToMongo()内部导出中间件(),这将确保首先连接到数据库,然后检查中间件,然后检查处理程序.

  1. 不需要在中间件函数中建立连接,只需在connectToMongo()函数中创建一个函数并使用,并确保将其传递给connectToMongo()函数,这将创建连接。

我试着用简单的方式解释我希望这会对你有所帮助。如果没有,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65348127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档