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 № 1Você tem duas opções:
- Use o armazenamento de sessão persistente
- 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.