【问题标题】: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);
        });
    });
};

【问题讨论】:

    标签: angularjs node.js session passport.js express-session


    【解决方案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',

    【讨论】:

    • 仍然遇到同样的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2017-09-18
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2014-06-04
    相关资源
    最近更新 更多