2015-06-12 11 views
5

Sto tentando di autenticare l'utente utilizzando passportjs utilizzando express.Passare informazioni utente nei percorsi da strategie Passport

Passport.js si presenta così.

var USER_INFO = {}; 
 
var FB_CALLBACK = 'http://localhost:3000/auth/facebook/callback'; 
 
module.exports = function(passport) { 
 
\t passport.use(new FacebookStrategy({ 
 
\t \t clientID: FB_CLIENT_ID, 
 
\t \t clientSecret: FB_CLIENT_SECRET, 
 
\t \t callbackURL: FB_CALLBACK 
 
\t }, 
 
\t function(accessToken, refreshToken, profile, done) { 
 
\t \t process.nextTick(function() { 
 
\t \t \t USER_INFO.id = profile.id; 
 
\t \t }); 
 
\t })); 
 
}

var express = require('express'); // call express 
var app = express(); // define our app using express 
var router = express.Router(); // get an instance of the express Route 
var passport = require('passport'); 
USER_INFO = {}; 
require('./config/passport')(passport); 
app.get('/auth/facebook', passport.authenticate('facebook')); 

app.get('/auth/facebook/callback', passport.authenticate('facebook', { 
    successRedirect : '/fb', 
    failureRedirect : '/error' 
})); 

app.get('/fb', function (req, res) { 
    res.json(USER_INFO); 
}); 

Voglio tutte le informazioni estratte in res.json (USER_INFO). Ma sta arrivando come vuoto. Quello che mi manca qui. Qual è il metodo migliore per salvare le informazioni di base dell'utente dell'utente per tenerlo loggato.

risposta

4

In primo luogo, si dovrebbe non negozio USER_INFO = {} al di fuori della portata della richiesta corrente. Se due utenti separati fanno una richiesta, riceveranno lo stesso oggetto .

Si dovrebbe almeno conservarle in un modo che sia possibile recuperarli separatamente

var USERS = {}; 
... 
module.exports... 
passport.use... 
... 

function(accessToken, refreshToken, profile, done) { 
    USERS[profile.id] = profile; 
    done(null, profile); 
})); 

Ora, se due utenti distinti facciano richiesta avranno le loro informazioni separatamente memorizzati all'interno USERS

{ 
    1234: {id: 1234, name: FOO}, 
    6789: {id: 6789, name: BAR}, 
} 

E done(null, profile) sarebbe serialize quell'utente. Se non è stato definito il vostro serialize/deserialize functions si dovrebbe fare in modo simile a questo:

passport.serializeUser(function (user, done) { 
    done(null, user.id); 
}); 
passport.deserializeUser(function (id, done) { 
    var user = USERS[id]; 
    done(null, user); 
}); 

Ora gli utenti saranno disponibili nell'ambito dei rispettivi contesti richiesta come req.user

Quindi non vi resta che fare:

app.get('/fb', function (req, res) { 
    res.json(req.user); 
}); 
+0

Nopes ... la sua non cattura la variabile. –

2

Hai dimenticato la chiamata done() in process.nextTick().

var FB_CALLBACK = 'http://localhost:3000/auth/facebook/callback'; 
module.exports = function(passport) { 
    passport.use(new FacebookStrategy({ 
     clientID: FB_CLIENT_ID, 
     clientSecret: FB_CLIENT_SECRET, 
     callbackURL: FB_CALLBACK 
    }, 
    function(accessToken, refreshToken, profile, done) { 
     process.nextTick(function() { 
      var USER_INFO = {}; 
      USER_INFO.id = profile.id; 
      done(USER_INFO) 
     }); 
    })); 
} 

È possibile passare qualsiasi oggetto a fatto(), diventerà req.user più avanti nel percorso. Nel tuo caso, il USER_INFO cui si desidera la risposta è req.user

app.get('/fb', function (req, res) { 
    res.json(req.user); 
}); 
Problemi correlati