2013-05-31 1 views
9

Sto utilizzando nodo, Express e passaporto con l'autenticazione di Facebook.
Ho i seguenti percorsi (quando /facebook/auth/callback è l'URL di callback):errore di autenticazione del passaporto che porta al ciclo di reindirizzamento

function render(page, req, res) { 
    var user = null; 
    if (req.user) { 
     user = req.user.toObject(); 
     user.isLoggedIn = true; 
    } 
    res.render(page, { user: user }); 
} 
app.get('/auth-failure', function (req, res) { 
    res.render('auth-failure'); 
}); 
app.get('/auth-success', function (req, res) { 
    render('auth-success', req, res); 
}); 
app.get('/facebook/auth', passport.authenticate('facebook', { scope: [ 'email', 'user_about_me', 'publish_actions']})); 
app.get('/facebook/auth/callback', passport.authenticate('facebook', { failureRedirect: '/auth-failure', successRedirect: '/auth-success' })); 

Quando l'autenticazione è riuscita ho avuto la visualizzazione della pagina auth-success come mi aspettavo. Ma quando l'autenticazione non è riuscita e ritorna facebook a: http://localhost:3000/facebook/auth/callback?error_code=2102&error_message=User+is+not+a+test+user+owned+by+the+application#=

non ottengo la vista auth-failure! Invece, firefox mi restituisce la pagina:

enter image description here

Durante l'esecuzione in cromo, ottengo il messaggio: enter image description here

Cerco di controllare le cose e ho sostituire il router mancata:

app.get('/facebook/auth/callback', function (req, res) { 
    res.redirect('/auth-failure'); 
}); 

E ciò ha reso la vista auth-failure riuscita.
Qual è il problema con l'autenticazione fallita di passport.js facebook?
Perché mi restituisce quella pagina di errore?

Riguardo a @ Matt Bakaitis commento:
Ecco me serializzare e deserializzare funzioni:

// serialize sessions 
passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findOne({ _id: id }, function (err, user) { 
     done(err, user); 
    }); 
}); 
+0

Sembra di esempio opere in Firefox però. – jhtong

+0

@toiletfreak: ho allegato l'immagine di questo comportamento errato in Firefox. – Naor

+0

Hai modificato il codice passport.serialize o passport.deserialize? –

risposta

1

Credo che sia perché si sta utilizzando un callback personalizzato e la necessità di fornire una res oggetto simile. ...

app.get('/facebook/auth/callback', function(req, res, next) { 
     passport.authenticate('facebook',.............. 
+0

Ma sto facendo esattamente quello che ho scritto qui: http://passportjs.org/guide/facebook/ – Naor

1

Vorrei accendere Fiddler per vedere cosa viene inviato esattamente sul filo.

1

Facendo ulteriori ricerche, perché uso anche passport.js per l'integrazione con un facebook (e altri), sembra che questo potrebbe essere già un open issue segnalato per il passport-oauth (che usa il passport-facebook).

La persona che accede il problema aveva una soluzione per il controllo degli errori sul line 98 of the oauth2 code:

app.get('/auth/facebook', passport.authenticate('facebook')); 
    app.get('/auth/facebook/callback', 
      , function(req, res, next) { 
        if (req.query && !req.query.error && req.query.error_code) { 
         req.query.error = true; 
        } 
        next(); 
      } 
      , passport.authenticate('facebook', { failureRedirect: '/auth-failure', successRedirect: '/auth-success' } 
    ); 

Per buona misura, è anche una buona idea di controllare due volte le vostre impostazioni di Facebook e che il localhost è elencato in la posizione giusta (s). Inoltre, verifica che tutto corrisponda perfettamente a Node.js. Ho avuto problemi con passport-twitter quando ho fatto un errore di battitura nelle mie stringhe di configurazione che è stato molto difficile da catturare in quanto non ha generato un errore in Node.js ma ha causato il fallimento della mia autenticazione in un modo difficile da catturare. Qui ci sono alcuni legami con persone che avevano lo stesso error_message come voi e sembrano indicare problemi di configurazione facebook-side:

+0

C'è un errore nel codice? Manca una parentesi o qualcosa del genere? – zehelvion