tokens e IDs diferentes, alem de juntar tudo isso em uma sessao de usuario unica. E ai que o passport pode nos ajudar. Deixaremos todo o trabalho pesado com ele, permitindo que nos concentremos apenas nas regras de negocio.Pra comecar, instalamos o passport, obviamente:npm install --save passport passport-local bcrypt express-sessionCaso voce use Windows, recomendo adicionar a flag msvs_version, com o ano do seu visual studio:npm install --save --msvs_version=2013 passport passport-local bcrypt express-sessionForam instaladas mais 3 bibliotecas nesse comando: passport-local, que e a "estrategia" que vamos utilizar na nossa aplicacao. O passport por padrao nao possui nenhum modulo de autenticacao (ele e apenas a API), por isso que seus modulos foram separados em projetos distintos. O passport-local e o modulo que implementa a autenticacao pelo metodo tradicional (login e senha). O bcrypt e o modulo responsavel por encriptar as senhas, e o express-session e o modulo responsavel por gerenciar as sessoes de usuario.Dito isso, precisamos agora criar o nosso modelo de usuario. Estamos aqui implementando a arquitetura MVC para nossa aplicacao. Criamos as Views, os controllers e agora so falta o modelo. O nosso modelo de usuario e bastante simples, ja que ele contem os dados necessarios para qualquer autenticacao. E de acordo com a necessidade, podemos adicionar mais recursos a ele. Mas por enquanto, ele esta de bom tamanho:var mongoose=require('mongoose'); var bcrypt=require('bcrypt'); /* * Criacao do schema, que e a estrutura da nosso documento. * So lembrando que como o Mongo e um banco no-SQL, nao existe o conceito de tabela e sim * de documento. */ var schema=mongoose.Schema({ auth:{ local:{ email:String, password:String, }, }, }); /* * Metodos pertencentes ao schema. Devem ser declarados antes da criacao do modelo. */ // encripta a senha schema.methods.generateHash=function(password){ return bcrypt.hashSync(password,bcrypt.genSaltSync(8),null); }; // Checa se a senha informada e igual a senha do banco schema.methods.checkPassword=function(password){ return bcrypt.compareSync(password, this.auth.local.password); }; // Cria o modelo, o que equivale a criacao do documento no banco. var User=mongoose.model('User', schema); module.exports=User; Em seguida, configuramos o arquivo lib/passport.js, que sera o nucleo da autenticacao. Aqui, estarao as configuracoes para todas as nossas estrategias. Para comecar, vamos apenas criar a estrategia de signup:var User=require('../models/User'); var LocalStrategy=require('passport-local'); module.exports=function(passport){ /* * Estas configuracoes permitem o login consistente e permamente */ passport.serializeUser(function(user,done){ done(null,user.id); }); passport.deserializeUser(function(id, done){ User.findById(id, function(err, user){ done(err,user); }); }); // Setup do modulo passport-local, que e chamado de estrategia. Como o passport suporta varios // tipos de configuracoes e abordagens diferentes, e recomendavel nomear as estrategias. // Para a estrategia local, utilizaremos os nomes 'local-signup' e 'local-signin' passport.use('local-signup', new LocalStrategy({ usernameField: 'email', passwordField: 'password', passReqToCallback: true // permite passar a requisicao inteira no callback }, function(req,email,pasword,done){ // e recomendavel que todo o procedimento seja feito de forma assincrona process.nextTick(function(){ /* * Verificando se o usuario ja esta cadastrado */ User.findOne({'auth.local.email':email}, function(err,user){ if(err) done(err); // se o usuario existir, exibe uma mensagem de erro. if(user){ return done(null, false, req.flash('signupMessage', 'Este e-mail ja esta sendo utilizado.')); }else{ // caso contrario, crie o novo usuario. var newUser=new User(); newUser.auth.local.email=email; newUser.auth.local.password=newUser.generateHash(password); // a senha deve ser encriptada antes da gravacao no banco. newUser.save(function(err){ if(err) throw err;