Exemplo de Autenticação em Node.JS - Autenticação via Facebook
Autor: Giovane Boaviagem | Publicado: 2015-01-21T13:29:00-08:00

Demais posts desta série:

Setup Local
Passport e Autenticação Local
Autenticação via Twitter e unindo contas
Autenticação via Google



Olá a todos!

Finalizando nossa série de posts sobre autenticação utilizando Node.JS, vamos adicionar à nossa aplicação o login via Facebook. O procedimento é o mesmo adotado para as autenticações externas anteriores (gerar as chaves e o ID do cliente, atualizar o config.js, atualizar o passport.js, etc). Porém, se você pensa que só é possível adicionar login externo somente com os serviços mostrados nesta série de posts, se engana. Neste link, estão relacionados todos os módulos do passport capazes de realizar autenticação externa. Lembre-se de olhar a documentação de cada módulo para ter certeza do que fazer para adicionar a sua aplicação.

Lembrando que o projeto completo está disponível&nbsp;aqui, e este tutorial foi baseado neste &nbsp;excelente&nbsp;link.

Como é de praxe, vamos agora gerar as nossas chaves. Acesse a página de desenvolvedores do Facebook, no menu superior, clique em My Apps, e se registre como desenvolvedor. Ao final do processo, esta página aparecerá:





Clique em website. Em seguida, digite o nome da nossa aplicação e clique em "Create New Facebook App ID". No pop-up, escolha a categoria (pode ser a primeira) e clique no botão azul para finalizar o processo. Após o carregamento da página do app, clique em "start over", no canto superior esquerdo para acessar o dashboard da nossa aplicação. De cara, você já encontra o App ID e o App Secret. Copie os dois para o arquivo config.js.

facebook:{
    consumer_key:'seu app id aqui',
    consumer_secret:'seu app secret aqui',
    callback_url:'http://127.0.0.1:3000/facebook/callback',
},


Depois, volte para o facebook, pois temos mais uma configuração para fazer. &nbsp;Por padrão, o Facebook não aceita que nenhuma URL se conecte com ele via OAuth. Assim, precisamos informar a ele qual URL ele deve aceitar. Em Configurações &gt; Aba advanced, na parte inferior da página tem um campo chamado "Valid OAuth redirect URIs". Neste campo, coloque a URL da nossa aplicação (http://127.0.0.1:3000). Salve tudo e, agora sim, podemos voltar para a nossa aplicação.

Próxima fase: atualizar o modelo (arquivo models/User.js):

    facebook:{
            id:String,
            token:String,
            email:String,
            name:String,
        },


Depois, instalamos o módulo do passport que se conecta ao facebook e configuramos a estratégia no arquivo lib/passport.js

npm install --save passport-facebook


...
var FacebookStrategy=require('passport-facebook').Strategy;
...

    /*************************
     ***** FACEBOOK AUTH *****
     *************************/
     
     passport.use(new FacebookStrategy({
        clientID: config.secret.facebook.consumer_key,
        clientSecret: config.secret.facebook.consumer_secret,
        callbackURL: config.secret.facebook.callback_url,
        passReqToCallback: true,
    }, function(req,token, refreshToken, profile, done){
        process.nextTick(function(){
            if(!req.user){
                User.findOne({'auth.facebook.id':profile.id}, function(err, user){
                    if(err) return done(err);
                    if(user){
                        return done(null, user);
                    }else{
                        var newUser=new User();
                        newUser.auth.facebook.id=profile.id;
                        newUser.auth.facebook.token=token;
                        newUser.auth.facebook.email=profile.emails[0].value;
                        newUser.auth.facebook.name=profile.name.givenName+' '+profile.name.familyName;

                        newUser.save(function(err){
                            if(err) throw err;

                            return done(null, newUser)
                        });
                    }
                });
            }else{
                var _user=req.user;
                
                _user.auth.facebook.id=profile.id;
                _user.auth.facebook.token=token;
                _user.auth.facebook.email=profile.emails[0].value;
                _user.auth.facebook.name=profile.name.givenName+' '+profile.name.familyName;
                
                _user.save(function(err){
                    if(err) throw err;
                    
                    return done(null, _user);
                });
            }            
        });
    }));


Em seguida, as rotas (arquivo config/routes.js):

'/facebook/connect':{
        controller:'LoginController',
        action:'facebookConnect',
    },
    
    '/facebook/callback':{
        controller:'LoginController',
        action:'facebookCallback',
    },
    
    '/facebook/link':{
        controller:'LoginController',
        action:'facebookLink',
        policy:'isAuthenticated',
    },
    
    '/facebook/link/callback':{
        controller:'LoginController',
        action:'facebookLinkCallback',
        policy:'isAuthenticated',
    },
    
    '/facebook/unlink':{
        controller:'LoginController',
        action:'facebookUnlink',
        policy:'isAuthenticated',
    },


Para finalizar, atualizamos as views. Primeiro o dashboard.hbs:

&lt;!--Facebook Information--&gt;
            &lt;div class="col-sm-6"&gt;
                &lt;div class="well"&gt;
                    &lt;h3 class="text-primary"&gt;&lt;span class="fa fa-facebook"&gt;&lt;/span&gt; Facebook&lt;/h3&gt;
                    {{#if user.auth.facebook.id}}
                        &lt;p&gt;
                            &lt;strong&gt;id&lt;/strong&gt;: {{user.auth.facebook.id}}&lt;br/&gt;
                            &lt;strong&gt;token&lt;/strong&gt;: {{user.auth.facebook.token}}&lt;br/&gt;
                            &lt;strong&gt;email&lt;/strong&gt;: {{user.auth.facebook.email}}&lt;br/&gt;
                            &lt;strong&gt;name&lt;/strong&gt;: {{user.auth.facebook.name}}&lt;br/&gt;
                        &lt;/p&gt;
                        &lt;a href="/facebook/unlink" class="btn btn-primary"&gt;Desassociar conta&lt;/a&gt;
                    {{else}}
                        &lt;a href="/facebook/link" class="btn btn-primary"&gt;Conectar ao Facebook&lt;/a&gt;
                    {{/if}}
                &lt;/div&gt;
            &lt;/div&gt;


Depois, o index.hbs:

&lt;a href="/facebook/connect" class="btn btn-primary"&gt;&lt;span class="fa fa-facebook"&gt;&lt;/span&gt; Facebook&lt;/a&gt;


Quando executarmos a aplicação, tudo deve estar funcionando devidamente.



Index




Dashboard


Com isso, encerramos a nossa série sobre autenticação utilizando o Node.JS. Lembrando que todo o código desenvolvido neste tutorial está&nbsp;disponível&nbsp;aqui, e qualquer dúvida&nbsp;referente ao desenvolvimento, podem postar nos comentários que responderei o máximo possível.

Inté.

Demais posts desta série:

Setup Local
Passport e Autenticação Local
Autenticação via Twitter e unindo contas
Autenticação via Google