Se você estiver usando sessões você tem que fornecer o passaporte com uma função de serialização e desserialização. A implementação do Redis como um armazenamento de sessão não tem nada a ver com a forma como o passaporte foi implementado, trata apenas de onde os dados da sessão são armazenados.
Implementando Sessões com passaporte
Como eu disse, as funções serializar e desserializar devem ser fornecidas no passaporte para que as sessões funcionem.
O objetivo do serializar função é retornar informações de identificação suficientes para recuperar a conta do usuário em quaisquer solicitações subsequentes. Especificamente o segundo parâmetro do
done()
método é a informação serializada nos dados da sessão . A desserialização função que você fornece destina-se a retornar o perfil do usuário com base nas informações de identificação que foram serializadas para a sessão .
Aqui está o exemplo do Guia do Passaporte na seção que discute as sessões:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
No exemplo acima
passport.serializeUser()
é fornecida uma função que recebe dois parâmetros, o perfil do usuário (user
) e uma função de retorno de chamada (done
). A função de retorno de chamada recebe como segundo parâmetro as informações de identificação (user.id
, mas se você estiver usando mongoDB, pode ser user._id
) necessário para recuperar a conta do banco de dados. Isso será chamado em cada solicitação autenticada e armazena as informações de identificação nos dados da sessão (seja em um cookie ou em sua loja Redis). passport.deserializeUser()
é fornecida uma função que também recebe dois parâmetros, a informação de identificação (id
) e novamente uma função de retorno de chamada (done
). A informação de identificação é o que foi serializado para os dados da sessão na solicitação anterior (user.id
). A função de retorno de chamada aqui requer o perfil do usuário como segundo parâmetro, ou qualquer erro gerado na recuperação do perfil como primeiro parâmetro. O User.findById()
function é uma função de pesquisa para o perfil do usuário no banco de dados. Neste exemplo User
object é uma instância de um modelo mangusto que tem o findById()
função. A função fornecida para
passport.deserializeUser()
é chamado pelo middleware de passaporte, passport.session()
antes do manuseio da rota para armazenar o perfil do usuário (user
) para req.user
. Implementando o Redis como um repositório de sessões
O objetivo de usar o Redis é armazenar o lado do servidor de dados da sessão para que o único lado do cliente armazenado seja o ID da sessão. Novamente, isso é independente de como você implementou o passaporte, o passaporte não se importa onde os dados da sessão estão sendo armazenados, desde que você tenha adicionado suporte à sessão ao seu aplicativo. Esta pergunta anterior no stackoverflow aborda como implementar o Redis