当前位置: 首页 > 知识库问答 >
问题:

Passport登录和持久会话

幸弘光
2023-03-14

我有一个与CRUD能力的平均应用程序完全测试与邮递员。我一直试图坚持登录相当长的一段时间,现在没有运气。我已经阅读并尝试了以下内容

  • 护照文档
  • Toon Io关于登录的博客
  • 快速会话
  • 苏格兰io,节点auth容易
  • 加上一些其他简单的阅读材料(很多这样的问题)

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

下面是我对用户登录的理解,包括我的项目中的代码示例和邮递员结果的截图以及控制台日志

我有下面的auth.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);
});

    null

我为测试会话设置了第二个路由,如下所示

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

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

});

passport.authenticate('local')部分(我认为)是为了在授予对路由的访问权限之前测试用户会话是否存在,但当我运行该部分时,即使在登录之后,也不会得到200的响应。

此路由是否期望在head中传递req.session.passport.user或作为需要Auth的http请求的数据参数?

如果我错过了什么或理解错了什么,请告诉我,任何输入都是感激的。谢谢大家。

共有1个答案

邓才
2023-03-14

用户现在是否在我的服务器上的会话中?

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

我应该将req.session.passport.user发送回客户端吗?

测试会话

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!'
    });
});
 类似资料:
  • 在我的laravel应用程序中,我执行了php artisan make:auth,所有文件都是为了进行身份验证而创建的。 我的AuthController.php代码: 我的用户。php: 我的路线。php: 问题是,如果我把用户名和密码放错了,它会告诉我它错了,当它正确时,它会重定向我,但当我登录到页面后,Auth::guest()为true,Auth::user()为null,因此不会创建会

  • 问题内容: 我正在使用请求模块(Python 2.5的版本0.10.0)。我已经弄清楚了如何将数据提交到网站上的登录表单并检索会话密钥,但是我看不到在后续请求中使用此会话密钥的明显方法。有人可以在下面的代码中填写省略号还是建议其他方法? 问题答案: 您可以使用以下方法轻松创建持久会话: 之后,请继续执行您的请求: 有关会话的更多信息,请访问:https : //requests.kennethre

  • 我有一个Vue CLI前端,所以我试图使用Laravel Passport来处理请求的身份验证。 https://laravel.com/docs/5.7/passport#consuming-使用javascript创建api 我有一个路由,它执行以下操作(几乎从这里复制和粘贴): 在我发出AJAX请求后,用户成功登录。 但是如果我在我的Vue行动中做这样的事情: 控制台显示以下内容: Lara

  • 问题内容: 我正在尝试使用Selenium Web驱动程序和node js自动执行几个页面。我可以登录,但是登录后我想使用由Web驱动程序启动的同一会话,以便可以在受会话保护的页面上进行自动测试。这是我的尝试 登录后我不小心丢弃了浏览器吗? 问题答案: 您可能只在处理计时问题。硒移动 非常快 。比您作为用户进行交互的方式要快得多。因此,它通常以似乎无法预测的方式起作用。但这仅仅是因为Seleniu

  • 7.4. 永久登录 永久登录指的是在浏览器会话间进行持续验证的机制。换句话说,今天已登录的用户明天依然是处于登录状态,即使在多次访问之间的用户会话过期的情况下也是这样。 永久登录的存在降低了你的验证机制的安全性,但它增加了可用性。不是在用户每次访问时麻烦用户进行身份验证,而是提供了记住登录的选择。 图7-2. 攻击者通过重播用户的cookie进行未授权访问 据我观察,最常见的有缺陷的永久登录方案是

  • 问题内容: 在CentOS 6.3上与Python 2.7,Apache + mod_wsgi一起运行 当我在localhost上时,一切正常。但是,当我在Azure中的vm上运行代码时,我看不到会话信息在页面之间保留。 基本上我的看法是: 打印输出为: 我对apache的wsgi配置是: 我设置了secret_key: 我尝试同时设置SERVER_NAME,但这无济于事: 关于如何进行更多调试的