adicionamos:'/local/link':{ controller:'LoginController', action:'localLink', policy:'isAuthenticated', }, 'POST /local/link':{ controller:'LoginController', action:'linkAccount', policy:'isAuthenticated', }, '/local/unlink':{ controller:'LoginController', action:'unlinkAccount', policy:'isAuthenticated', }, Em seguida, modificamos o arquivo lib/passport.js, para atualizar a nossa estrategia e contemplar as acoes de link e unlink. No final, todas as estrategias vao ter a mesma alteracao, que e verificar se o usuario esta logado. Caso esteja, basta atualizar o registro com os dados novos de autenticacao. Em caso contrario, segue o que estava antes. Aqui sera mostrado apenas o codigo final da estrategia local do signup, que e a unica das 2 estrategias locais em que esta alteracao sera necessaria.passport.use('local-signup', new LocalStrategy({ usernameField: 'email', passwordField: 'password', passReqToCallback: true }, function(req,email,password,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); if(!req.user){ // se o usuario existir, exibe uma mensagem de erro. if(user){ return done(null, false, req.flash('signupMessage', 'Usuario ja cadastrado.')); }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; return done(null, newUser, req.flash('signupMessage', 'Usuario cadastrado com sucesso.')); }); } }else{ //atualizar o usuario com os dados novos. var _user=req.user; _user.auth.local.email=email; _user.auth.local.password=_user.generateHash(password); _user.save(function(err){ if(err) throw err; return done(null, _user, req.flash('signupMessage', 'Usuario atualizado.')); }); } }); }); })); // fim da estrategia para o signup.Agora, atualizamos o arquivo controllers/LoginController para adicionar nossas novas actions (link e unlink): localLink:function(req,res){ res.render('addAccount'); }, linkAccount:passport.authenticate('local-signup',{ successRedirect:'/dashboard', failureRedirect:'/local/link', }), unlinkAccount:function(req,res){ var _user=req.user; _user.auth.local.email=undefined; _user.save(function(err){ if(err) throw err; res.redirect('/dashboard'); }); },Como voces puderam perceber, a view renderizada para a action localLink tem o nome 'addAccount'. Portanto, vamos criar esta view, que e praticamente uma copia da view de signup:<div class="col-sm-6 col-sm-offset-3"> <h1><span class="fa fa-sign-in"></span> Add Account</h1> <form action="/local/link" method="post"> <div class="form-group"> <label>Email</label> <input type="text" class="form-control" name="email"> </div> <div class="form-group"> <label>Senha</label> <input type="password" class="form-control" name="password"> </div> <button type="submit" class="btn btn-warning btn-lg">Cadastrar</button> </form></div>Para finalizar, alteramos a view de dashboard para refletir as nossas mudancas.<div class="container"> <div class="page-header text-center"> <h1><span class="fa fa-anchor"></span> Dashboard</h1> <a href="/signout" class="btn btn-default btn-sm">Logout</a> <div class="row"> <!--Local information--> <div class="col-sm-6"> <div class="well"> <h3><span class="fa fa-user"></span> Local</h3> {{#if user.auth.local.email}} <p> <strong>id</strong>: {{user._id}}<br/> <strong>email</strong>: {{user.auth.local.email}}<br/> <strong>password</strong>: {{user.auth.local.password}}<br/> </p> <a href="/local/unlink" class="btn btn-default">Desassociar conta</a> {{else}} <a href="/local/link" class="btn btn-default">Cadastrar conta local</a> {{/if}} </div> </div> <!--Twitter Information--> <div class="col-sm-6"> <div class="well"> <h3 class="text-info"><span class="fa fa-twitter"></span> Twitter</h3> <p> <strong>id</strong>: {{user.auth.twitter.id}}<br/> <strong>token</strong>: {{user.auth.twitter.token}}<br/> <strong>username</strong>: {{user.auth.twitter.username}}<br/> <strong>displayName</strong>: {{user.auth.twitter.displayName}}<br/> </p> </div> </div> </div> </div></div>Agora, quando executarmos nossa aplicacao e nos logarmos pelo Usuario B (via Twitter), a tela ficara parecida com essa:Ou seja, a view verifica se o usuario possui autenticacao local. Caso nao tenha, o botao de cadastrar autenticacao local aparece. Apos apertar no botao e cadastrar o email e senha (cadastre um e-mail diferente, para que nao ocorram erros), a tela ficara assim:Se nos clicarmos em Desassociar Conta, tanto o e-mail quanto a senha serao apagados, e a aplicacao volta para a tela anterior.Para associarmos com a conta do Twitter, o processo e semelhante. Primeiramente as rotas: '/twitter/link':{ controller:'LoginController', action:'linkTwitter', policy:'isAuthenticated', }, '/twitter/link/callback':{ controller:'LoginController', action:'linkTwitterCallback', policy:'isAuthenticated', }, '/twitter/unlink':{ controller:'LoginController', action:'unlinkTwitter', policy:'isAuthenticated',