护照会话不存在

Posted

技术标签:

【中文标题】护照会话不存在【英文标题】:Passport session is not presisting 【发布时间】:2017-09-30 22:17:34 【问题描述】:

您好,我正在尝试使用本地护照策略实现登录。出于某种奇怪的原因,当我从邮递员发送请求时,我的代码可以工作,但是当我从我的角度项目中调用相同的操作时,它不起作用。追查我发现的问题:

当我从邮递员发送请求时,会话如下所示:

Session 
    cookie:  
           path: '/',
           _expires: null,
            originalMaxAge: null,
            httpOnly: true 
    ,
    passport:  
             user: 58f0865eb9b69e1d38fa135b 
     

当我从 Angular 发送请求时,会话如下所示:

Session 
    cookie:  
           path: '/',
           _expires: null,
            originalMaxAge: null,
            httpOnly: true 
    

因为 with passport 策略无法反序列化用户。我不知道为什么会这样,任何帮助将不胜感激。

服务器代码:

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: true ));
app.use(expressValidator(
    customValidators: 
        isArray: function (value) 
            return Array.isArray(value);
        
    ,
    errorFormatter: function (param, msg, value) 
        var namespace = param.split('.')
            , root = namespace.shift()
            , formParam = root;

        while (namespace.length) 
            formParam += '[' + namespace.shift() + ']';
        
        return 
            param: formParam,
            msg: msg,
            value: value
        ;
    
));

app.use(cookieParser());
app.use(expressSession( secret: 'untoldstoryofninja', resave: false, saveUninitialized: true ));
app.use(cors());
app.use(passport.initialize());
app.use(passport.session());

// routes ========================================================================================
app.use(require('./config/routes/routes.js')(passport));
app.all('*', (req, res) => res.status(404).send( msg: 'No API Route.' ));  

护照攻略:

module.exports = function (passport) 
    passport.use(new LocalStrategy( usernameField: "username", passwordField: "password" ,
        function (username, password, done) 
            User.findOne( username: username , function (err, user) 
                if (err)  return done(err); 
                if (!user)  return done(null, false); 
                if (user.comparePassword(password, function (err, isMatch) 
                    if (isMatch && !err) 
                        done(null, user)
                     else 
                        done(null, false);
                    
                ));
            );
        
    ));

    passport.serializeUser(function (user, done) 
        done(null, user._id);
    );

    passport.deserializeUser(function (id, done) 
        User.findById( _id: id , function (err, user) 
            done(err, user);
        );
    );
;

【问题讨论】:

【参考方案1】:

你需要做的

passReqToCallback: 真

passport.use(new LocalStrategy(
    usernameField: 'email',
    passwordField: 'passwd',
    passReqToCallback: true,
    session: false
  ,
  function(req, username, password, done) 
    // request object is now first argument
    // ...
  
));

还要确保您的字段名称与

匹配

sernameField: 'email',

密码字段:'passwd',

【讨论】:

仍然遇到同样的问题

以上是关于护照会话不存在的主要内容,如果未能解决你的问题,请参考以下文章

快速护照会话不起作用

PHP会话变量在不应该存在的时候存在,在应该存在的时候不存在

访问护照中的会话信息

对象在 R browser() 会话中既存在又不存在

使用护照 + JWT 或会话保护 GraphQL API? (举例)

“指定的登录会话不存在。它可能已经被终止”在我将设备加入到 Azure Active Directory 之后