Passport / ExpressJS - 如何使用Cookie正确维护会话状态?

时间:2017-07-10 22:07:40

标签: node.js session express authentication passport.js

  

我是新手使用Passport身份验证和我之间的快递   服务器和客户端(在两个不同的端口上),我很棒   麻烦理解维护会话状态的概念   使用Passport并尝试检索if any((A == 'string1', B == 'string2', C=='string3')): flag = 1   以确定是否从具有的用户发送请求   成功登录。

     

使用Passport检查持久会话状态

     

在我的代码中,我有一个使用我自己的个人资料页面的路线   认证功能。我的登录路线使用   但是,req.session.passport.user我应该申请这个吗?   到所有后续路线(比如我的个人资料),或者是我的分开   预期认证?

     

passport.authenticate('local') undefined

     

由于某种原因,使用/ profile GET请求发送的cookie在成功登录后缺少req.session.passport对象(通过   passport如果我,它看起来如下   passport.use('local-login')中的console.log(req.session)为什么会这样?

authenticated
     

服务器代码

Session {
   cookie:
    { path: '/',
      _expires: 2017-07-11T01:38:30.087Z,
      originalMaxAge: 14400000,
      httpOnly: true,
      secure: false } }
     

客户代码

// server.js
let app = express();
app.use(cors());
import passportConfig from '../config/passport';
passportConfig(passport); //apply passport configuration
var jsonParser = bodyParser.json();
app.use(jsonParser);
app.use(cookieParser('mySecret'));
app.use(session({
  secret: 'mySecret',
  resave: false,
  saveUninitialized: true,
  cookie: {secure: false, maxAge: 4*60*60*1000 }
}));
app.use(passport.initialize());
app.use(passport.session());

function authenticated (req, res, next) {
    // req.session.passport is undefined
    if (req.session.passport.user) {
        next();
    }
    else {
        res.redirect('/signup');
    }
}

app.get('/profile', authenticated, (req, res) => {
    // server code handling route
}

app.post('/login', passport.authenticate('local-login', {
    session: true
}), (req, res) => {
     res.json({
         email: req.user.local.email
     });
});


// passport.js
import User from '../models/User';

export default function passportConfig(passport) {
    passport.serializeUser((user, done) => {
        console.log('serializing user');
        done(null, user.id);
    });

    // used to deserialize the user
    passport.deserializeUser((id, done) => {
        console.log('deserializing user');
        User.findById(id, (err, user) => {
            done(err, user);
        });
    });

    passport.use('local-login', new LocalStrategy({
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true
    }, (req, email, password, done) => {
        // if verification is successful
        var newUser = new User();
        // set credentials of newUser...
        return done(null, newUser);
    }));
}
     

我知道实际上有很多文章/帖子可供使用   类似的问题,但应用了许多不同的解决方案   都失败了。特别是对我的问题有任何帮助   赞赏。

0 个答案:

没有答案