Login de passaporte e sessão persistente

fundo

Eu tenho um aplicativo MEAN com recursos CRUD totalmente testados com carteiro. Eu tenho tentado persistir o login por algum tempo agora sem sorte. Eu li e tentei o seguinte

documentos de passaporteBlog de toon io sobre loginSessão expressaScotch io, autenticação de nó facilitadaAlém de vários outros materiais de leitura leve (muitas perguntas sobre SO)

Mas eu só consegui registrar e efetuar login de um usuário, não persistir o login com uma sessão.

My App

Aqui é um link para o repositório completo do github (se você estiver procurando as últimas alterações, verifique o ramo de desenvolvimento)

Meu entendimento de autenticação / login

Aqui está minha compreensão do login do usuário com exemplos de código do meu projeto e captura de tela dos resultados do carteiro, bem como dos logs do console.

Configuração do passaporte

Eu tenho o seguinte arquivo auth.js, ele configura o passaporte

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);
    });
  });
};

Isso é chamado no arquivo do servidor como

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

Nas minhas rotas, tenho a rota de login da seguinte maneira

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);
});

Esta rotatrabalho como testado com carteiro. Entro os detalhes 'joe' e 'pass' e recebo a seguinte resposta.

Quando essa rota é atingida, também podemos ver no console que o usuário está serializado.

Então o que vem depois?

É aqui que eu me perco. Eu tenho algumas perguntas.

O usuário agora está em uma sessão no meu servidor?Devo enviar oreq.session.passport.user de volta para o cliente?Preciso do ID da sessão em todas as solicitações futuras?Testando a sessão

Eu tenho uma segunda configuração de rota para testar a sessão, é a seguinte

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

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

});

A partepassport.authenticate('local') (Pensei) existe para testar se a sessão do usuário existe antes de dar acesso à rota, mas nunca recebo uma resposta 200 quando executo isso, mesmo após um login.

Esta rota espera umreq.session.passport.user passado na cabeça ou como um argumento de dados em uma solicitação http que requer autenticação?

Se eu perdi alguma coisa ou estou entendendo algo errado, diga-me, qualquer contribuição é apreciada. Obrigado a todos.

questionAnswers(5)

yourAnswerToTheQuestion