2012-10-13 6 views
5

Ich verwende die Passport-Linkedin-Strategie für Passport mit Express, damit sich Benutzer mit ihrem LinkedIn-Profil anmelden können.Wie wird der aktuelle Host für die Passport-Strategie callbackURL festgelegt?

Ich habe den folgenden Code:

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); 
    }); 
    } 
)); 

Zeile 4, ich habe manuell die vollständige Rückruf-URL zu setzen. Ich hatte eine Zeichenfolge für die Produktion und eine für die Entwicklung, aber meine URLs ändern sich ständig, und ebenso die Ports (ich benutze 2 Maschinen für die Entwicklung).

Wie kann ich den ersten Teil der URL (http://localhost:3000) automatisch einstellen? Gibt es eine Eigenschaft von express oder app, die mir erlauben würde, das zu tun? Muss ich auf eine app.use(function(req, res){}); zurückgreifen?

Danke!

Antwort

4

Alte Frage, möglicherweise y Antwort nur gültig für neuere Versionen. Allerdings, wenn jemand in diesen läuft, wie ich, ist Lösung gerade nicht einen Hostnamen in den callbackURL angeben:

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

Um diese Umleitung für Heroku https zu arbeiten, haben wir das System mitzuteilen, die x-forwarded-protocol Header vertrauen , indem Sie dem Proxy vertrauen:

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

Es funktioniert nicht, wenn Ihre App nicht im Root-Pfad läuft, zum Beispiel läuft sie auf '/ myapp' anstelle von'/'. –

0

In meinem config.js ich cfg.site_url haben, ist, dass ein Weg, oder könnten Sie bei req.host sehen

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

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

Nicht sicher, ob Sie eine erf Objekt haben in Ihrem Kontext dort.

+0

Ich begann mit einer Konfigurationszeichenfolge, aber Servernamen und Ports ändern sich ständig. Ich bin auf der App-Ebene - der einzige Weg, um eine Anforderung zu bekommen, ist, soweit ich weiß, diese App.use-Anweisung, die ich erwähnt habe. Das Problem ist, dass es für jede Anfrage aufgerufen wird. –

+0

können Sie eine Middleware für Ihre Anfrage bereitstellen. Etwas wie 'app.get ('/ was auch immer', loadConfigVariable, routes.whatever);' und 'app.locals.whatever = config.whatever' innerhalb der loadConfigVariable-Funktion. – chovy

+0

Das habe ich versucht zu vermeiden - eine andere Route. Ich frage mich, ob ich diese Funktionalität in Passport selbst finden kann? –

0

Schließlich gelöst durch dynamisches Erstellen der Callback-URL aus Teilen der URL und dem tatsächlichen Port. Nicht zufrieden mit dieser Lösung, da sie nicht elegant aussieht, aber keine Möglichkeit gefunden hat, die tatsächliche URL ohne Hinzufügen eines Middleware-Aufrufs zu erhalten (was die Performance sicherlich stärker beeinflusst als eine einfache String-Verkettung).

Verwandte Themen