Background

我有一个简单的应用程序,它的CRUD功能经过了postman的全面测试.我已经有一段时间没有try 登录了.我已经阅读并try 了以下内容

但我只能注册和登录一个用户,不能持久登录会话.

My App

Here是完整github回购协议的链接(如果您正在寻找最新的更改,请查看开发分支)

My Understanding of Auth/Login

以下是我对用户登录的理解,包括我的项目中的代码示例、postman 结果的屏幕截图以及控制台日志(log).

Passport 设置

我有以下授权.js文件,配置passport

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

module.exports = function(app, user){

  app.use(passport.initialize());
  app.use(passport.session());

  // passport config
  passport.use(new LocalStrategy(user.authenticate()));

  passport.serializeUser(function(user, done) {
    console.log('serializing user: ');
    console.log(user);
    done(null, user._id);
  });

  passport.deserializeUser(function(id, done) {
    user.findById(id, function(err, user) {
      console.log('no im not serial');
      done(err, user);
    });
  });
};

这会在服务器文件中被调用,比如

//code before
var user    = require('./models/user.js');
var auth    = require('./modules/auth.js')(app, user);
// code after

登录路由

在我的路径中,我的登录路径如下

router.post('/login', function(req, res, next) {

  passport.authenticate('local', function(err, user, info) {

    if (err) {
        return next(err);
    }

    if (!user) {
        return res.status(401).json({
            err: info
        });
    }

    req.logIn(user, function(err) {

        if (err) {
            return res.status(500).json({
                err: 'Could not log in user'
            });
        }

        res.status(200).json({
            status: 'Login successful!'
        });

    });
  })(req, res, next);
});

这条works号公路经过postman 的测试.我输入详细信息"joe"和"pass",并得到以下响应.

enter image description here

当点击该路径时,我们还可以在控制台中看到用户被序列化.

enter image description here

So what next?

这就是我迷路的地方.我有几个问题.

  1. 用户现在是否正在我的服务器上进行会话?
  2. 我应该把req.session.passport.user美元寄还给客户吗?
  3. 我是否需要future 所有请求的会话ID?

Testing the Session

我有一个测试会话的第二个路由设置,如下所示

router.get('/checkauth', passport.authenticate('local'), function(req, res){

    res.status(200).json({
        status: 'Login successful!'
    });

});

passport.authenticate('local')部分(我认为)是为了测试用户会话是否存在,然后才允许访问路由,但当我运行此部分时,即使在登录之后,也从未得到200响应.

该路由是否希望在头中传递req.session.passport.user,或者作为需要auth的http请求的数据参数?

如果我错过了什么或者理解错了什么,请告诉我,任何意见都将不胜感激.谢谢大家.

推荐答案

Is the user now in a session on my server?

不,您需要使用app.use(passport.session());之前的express-session中间件将会话实际存储在内存/数据库中.该中间件负责为浏览器设置cookie,并将浏览器发送的cookie转换为req.session对象.PassportJS只使用该对象进一步反序列化用户.

Should I send the req.session.passport.user back to the client?

如果你的客户在登录时希望有user个资源,那么你应该这样做.否则,我看不出有任何理由将用户对象发送到客户端.

Do I need the session ID on all future requests?

是的,对于将来的所有请求,都需要会话id.但如果你的客户是浏览器,你不需要发送任何东西.浏览器将会话id存储为cookie,并将其发送给所有后续请求,直到cookie过期.express-session将读取该cookie并将相应的会话对象附加为req.session.

Testing the Session

passport.authenticate('local')用于从帖子正文验证用户凭据.您应该仅将其用于登录路径.

但要判断用户是否在所有其他路由中经过身份验证,可以判断是否定义了req.user.

function isAuthenticated = function(req,res,next){
   if(req.user)
      return next();
   else
      return res.status(401).json({
        error: 'User not authenticated'
      })

}
router.get('/checkauth', isAuthenticated, function(req, res){

    res.status(200).json({
        status: 'Login successful!'
    });
});

Node.js相关问答推荐

postgresql层与应用层的序列化

聚合发布/订阅消息

在Node JS中获取控制台选项卡标题

无法使用NPM安装REDUX和DATEPPICER

如何模拟 mysql2 `getConnection`

在 TypeScript 中正确键入 MongoDB find 方法

PEAN auth 应用程序:为什么 Angular 拦截器总是使用BehaviorSubject 返回 null(即初始值),而不是更新后的值?

如何使用 Remix 仅在客户端呈现组件?

只要我在后端正确验证所有内容,就可以将这些数据存储在本地存储中吗?

如何找到特定文档并更新数组中特定键的值?

使用`useLocalStorage`和`useDebounce`时如何解决Next.js中的react-hydration-error

是Electron 的密码和登录凭据的安全存储吗?

Sharp JS 依赖关系 destruct 了 Elastic Beanstalk 上的 Express Server

cURL 和 shell 任务

`npm install` 以Killed结尾

node.js 是否支持yields ?

MongoDB Node findone如何处理没有结果?

如何在 node 中找到引用站点 URL?

使用 pm2 编程 api 重命名进程

找不到在 docker compose 环境中运行的 node js 应用程序的模块