/ / Express: usando o Passport para autenticar usando uma sessão - express, passport.js

Express: Usando o Passport para autenticar usando uma sessão - express, passport.js

Estou usando o Express 4 com o Node.js - Implementei com êxito o Passport para autenticar com um nome de usuário / senha. Mas como faço para o Passport autenticar apenas com informações da sessão?

Como eu criaria uma estratégia personalizada do Passport para obter as informações da sessão e compará-las com as informações de um determinado usuário?

Eu estou procurando por isso:

passport.use(new SessionStrategy(function(req,res,done){
if(req.session blah blah blah){
???
}
});
);

Eu realmente não tenho ideia de qual é a melhor maneira de fazeristo é. Talvez eu armazene informações mais recentes da sessão do usuário no banco de dados de back-end. Então, em vez de encontrar um usuário com seu nome de usuário, eu encontrar um usuário com o id de sessão?

Uma resposta parece ser a seguinte:

Este é o código para colocar o ID da sessão em um cookie e recuperar os dados quando o usuário retornar. Nenhuma estratégia é necessária.

passport.serializeUser(function(user, done) {
done(null, user.id);
});

passport.deserializeUser(function(id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});

Respostas:

1 para resposta № 1

Você tem duas opções:

  1. Use o armazenamento de sessão persistente
  2. Token Web JSON

Para implementar a sessão persistente, você pode usar o armazenamento de sessão do MongoDB ou o armazenamento da sessão do Redis.

Se você quiser usar redis, faça uso de conectar-redis pacote npm. Se você quiser usar o MongoDb como armazenamento de sessão, faça uso de conectar-mongo pacote npm

Existem algumas configurações que você precisa fazer em seu app.js / server.js. Em uma de minhas demonstrações, estou usando a loja da Redis Session com o PassportJS, se você estiver procurando por exemplo, fique à vontade para procurar Aqui.

Se você quiser usar tokens da Web JSON, existem muitas implementações diferentes disponíveis. estou usando jsonwebtoken. Implementei isso usando PassportJS, ExpressJS e AngularJS no front end. Por exemplo, olhe Aqui. Os tokens são codificados e armazenados no armazenamento local do navegador com uma chave secreta.

Eu sugiro que você use os tokens da Web JSON, leia-os em detalhes, porque é assim que a maioria dos principais aplicativos da Web são desenvolvidos.

Ambos os meus exemplos estão trabalhando em protótipo. Deixe-me saber se você precisar de mais ajuda.


1 para resposta № 2

A maneira ideal de fazer isso é armazenar um ID de usuárioa sessão (ou um JWT como @NarendraSoni mencionado). A idéia principal é armazenar o mínimo possível de informações úteis na sessão, já que você deve tratá-las como se fossem publicamente disponíveis para todos.

Se você armazenar apenas um ID de usuário, por exemplo, toda vez que receber uma solicitação (req.session.userId, por exemplo), você poderia simplesmente executar uma consulta de banco de dados para recuperar esse usuário pelo ID.

Isso é rápido (especialmente se você usar um cache do lado do servidor como o memcached ou o redis) e causar muito pouca latência. Também é seguro e evita o vazamento de informações do usuário para o navegador.

Se você está procurando uma maneira mais simples de lidar com essas coisas no seu aplicativo, talvez queira verificar minha biblioteca de autenticação: expressar-stormpath. Ele faz tudo isso fora da caixa, émuito seguro, e fornece muitos utilitários auxiliares para você ir mais rápido: você pode armazenar dados personalizados em contas (como mongo), você pode restringir os usuários com base em permissões, você pode fazer autenticação de API, etc.