2012-12-02 16 views
8

Sto utilizzando passport.js per autenticare gli utenti. Mi piacerebbe essere in grado di passare un nome utente, raccolto dall'utente, che raggiungerà la fine del processo di autenticazione in modo che possa memorizzare il nome utente quando creo l'utente (se non esiste ancora). Ho provato questo:Come posso passare un parametro attraverso la mia catena passport.js?

app.get("/auth/google", function(request, response) 
{ 
    console.log(request.query.username); 

    passport.authenticate("google", 
    { 
     scope: 
     [ 
      "https://www.googleapis.com/auth/userinfo.profile", 
      "https://www.googleapis.com/auth/userinfo.email" 
     ] 
    })(request, response); 
}); 

app.get("/auth/google/callback", function(request, response) 
{ 
    console.log(request.query.username); 

    passport.authenticate("google", 
    { 
     successRedirect: "/", 
     failureRedirect: "htm/error" 
    })(request, response); 
}); 

La chiamata a/auth/google stampa il nome utente, ma le stampe di callback definito. Anche se potessi ottenere il nome utente per la richiamata, non sono ancora sicuro di come ottenere la strategia di Google. Dovrei quindi creare la mia strategia per farlo funzionare?

risposta

7

si può passare uno stato oggetto da passport.authenticate, in questo modo:

passport.authenticate("google", 
{ 
    scope: 
    [ 
     "https://www.googleapis.com/auth/userinfo.profile", 
     "https://www.googleapis.com/auth/userinfo.email" 
    ], 
    state: request.query.username 
})(request, response); 

È possibile accedere allo stato attraverso req.query.state.

Il nome utente deve essere una stringa, non un oggetto. Se si desidera memorizzare un oggetto nello stato, chiamare JSON.stringify prima e analizzarlo nella richiamata.

1

Per chiunque usi OpenID, req.query sembra essere sovrascritto dai parametri di query OpenId e quindi non può essere passato direttamente. È tuttavia possibile associare variabili a req.session.

router.get('/auth/social', (req, res, next) => { 
    req.session.foo = req.query.foo; 
    next(); 
}, passport.authenticate('social')); 

e non dimenticare di includere la bandiera passReqToCallback nelle opzioni strategiche:

{ 
    passReqToCallback: true, 
    returnURL: config.app.returnUrl, 
    realm: config.app.realm, 
    apiKey: config.app.apiKey 
} 
+0

E 'possibile che le sessioni ei cookie vengono sovrascritti anche da una strategia di OpenID (https://github.com/liamcurry/passaporto-vapore)? Ho provato la soluzione, ma 'req.session.foo' è' indefinito' nel percorso di callback. – guest459473

Problemi correlati