2012-10-13 9 views
5

Sto utilizzando la strategia Passport-Linkedin per Passport con Express, per consentire agli utenti di accedere con il proprio profilo LinkedIn.Come impostare l'host corrente per Passport strategy callbackURL?

Ho il codice seguente:

passport.use(new LinkedInStrategy({ 
    consumerKey: config.linkedin.LINKEDIN_API_KEY, 
    consumerSecret: config.linkedin.LINKEDIN_SECRET_KEY, 
    callbackURL: "http://localhost:3000/auth/linkedin/callback" 
    }, 
    function(token, tokenSecret, profile, done) { 
    // asynchronous verification, for effect... 
    process.nextTick(function() { 

     // To keep the example simple, the user's LinkedIn profile is returned to 
     // represent the logged-in user. In a typical application, you would want 
     // to associate the LinkedIn account with a user record in your database, 
     // and return that user instead. 
     return done(null, profile); 
    }); 
    } 
)); 

Nella riga 4, devo impostare manualmente l'URL completo di callback. Avevo una stringa per la produzione e una per lo sviluppo, ma i miei URL continuano a cambiare, così come le porte (io uso 2 macchine per svilupparle).

Come si imposta la prima parte dell'URL (http://localhost:3000) automaticamente? Esiste una proprietà di express o app che mi consentirebbe di farlo? Devo ricorrere a un app.use(function(req, res){});?

Grazie!

risposta

4

Vecchia domanda, possibilmente y risposta valida solo per le versioni più recenti. Tuttavia, se qualcuno si imbatte in questo, come me, la soluzione è solo quello di non specificare un nome host nel callbackURL:

passport.use(new LinkedInStrategy({ 
    consumerKey: config.linkedin.LINKEDIN_API_KEY, 
    consumerSecret: config.linkedin.LINKEDIN_SECRET_KEY, 
    callbackURL: "/auth/linkedin/callback" 
    }, 

Per ottenere questo a lavorare per Heroku https reindirizzamento, dobbiamo dire al sistema di fidarsi dei x-forwarded-protocol intestazioni , affidando il proxy:

passport.use(new LinkedInStrategy({ 
    consumerKey: config.linkedin.LINKEDIN_API_KEY, 
    consumerSecret: config.linkedin.LINKEDIN_SECRET_KEY, 
    callbackURL: "/auth/linkedin/callback", 
    proxy: true 
    }, 
+2

Non funziona se l'app non è in esecuzione sul percorso root, ad esempio è in esecuzione su/myapp' invece di '/'. –

0

Nei miei config.js ho un cfg.site_url, questo è un modo, o si poteva guardare req.host

http://expressjs.com/api.html#req.host

// Host: "example.com:3000" 
req.hostname 
// => "example.com" 

Non è sicuro se si dispone di un oggetto req nella vostra contesto lì.

+0

Ho iniziato con una stringa di configurazione, ma i nomi dei server e le porte continuano a cambiare. Sono a livello di app - l'unico modo per ottenere un req, per quanto ne so, è quello di aggiungere quell'affermazione app.use che ho menzionato. Il problema è che poi viene chiamato per ogni richiesta. –

+0

puoi fornire un middleware per la tua richiesta. Qualcosa come 'app.get ('/ qualunque', loadConfigVariable, routes.whatever);' e 'app.locals.whatever = config.whatever' all'interno della funzione loadConfigVariable. – chovy

+0

Questo è quello che stavo cercando di evitare - un'altra strada. Mi chiedo se riesco a trovare quella funzionalità nella stessa Passport? –

0

Eventualmente risolto risolvendo dinamicamente l'URL di callback da parti di URL e dalla porta effettiva. Non contento di questa soluzione in quanto sembra non elegante, ma non è stato in grado di trovare un modo per ottenere l'URL effettivo senza aggiungere una chiamata al middleware (che sono certo che influisce sulle prestazioni più di una semplice concatenazione di stringhe).

Problemi correlati