Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Eu implemento serializar e desserializar NodesJS + Passport + RedisStore?


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