Login de passaporte e sessão persistente
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 AppAqui é 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 / loginAqui 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 passaporteEu 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 loginNas 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ãoEu 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.