2012-10-13 7 views
5

Używam strategii Passport-Linkedin dla usługi Passport with Express, aby umożliwić użytkownikom logowanie się przy użyciu profilu LinkedIn.Jak ustawić bieżący host dla callbackURL strategii Passport?

Mam następujący kod:

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

Na linii 4, muszę ręcznie ustawić pełny oddzwonienia URL. Miałem jeden ciąg do produkcji i jeden do programowania, ale moje adresy URL wciąż się zmieniają, podobnie jak porty (używam 2 maszyn do opracowania).

Jak automatycznie ustawić pierwszą część adresu URL (http://localhost:3000)? Czy istnieje własność express lub app, która pozwoliłaby mi to zrobić? Czy muszę odwołać się do app.use(function(req, res){});?

Dzięki!

Odpowiedz

4

Stare pytanie, prawdopodobnie odpowiedź odpowiednia tylko dla nowszych wersji. Jednak jeśli ktoś prowadzi do tego, jak ja, rozwiązanie jest tylko, aby nie podać nazwę hosta w callbackURL:

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

Aby uzyskać to do pracy dla Heroku https przekierować, musimy powiedzieć, że system zaufać nagłówki x-forwarded-protocol , ufając pełnomocnictwu:

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

Nie działa, jeśli aplikacja nie działa na ścieżce głównej, na przykład działa na '/ myapp' zamiast'/'. –

0

W moich config.js Mam cfg.site_url, to jeden ze sposobów, czy można patrzeć na req.host

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

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

Nie wiem, czy masz obiekt req w twojej tam kontekst.

+0

Zacząłem od napisu konfiguracyjnego, ale nazwy i porty serwerów ciągle się zmieniają. Jestem na poziomie aplikacji - jedynym sposobem na uzyskanie odpowiedzi, o ile wiem, jest dodanie wspomnianej instrukcji app.use, o której wspomniałem. Problem polega na tym, że jest on wywoływany dla każdego żądania. –

+0

można zapewnić oprogramowanie pośrednie dla jednego żądania. Coś jak 'app.get ('/ cokolwiek', loadConfigVariable, routes.whatever);' i 'app.locals.whatever = config.whatever' wewnątrz funkcji loadConfigVariable. – chovy

+0

Tego właśnie próbowałem uniknąć - innej trasy. Zastanawiam się, czy mogę po prostu znaleźć tę funkcję w samym Passportie? –

0

Ostatecznie rozwiązano to przez dynamiczne budowanie adresu zwrotnego adresu URL z fragmentów adresu URL i rzeczywistego portu. Nie jest zadowolony z tego rozwiązania, ponieważ wygląda nie-elegancko, ale nie może znaleźć sposobu na uzyskanie rzeczywistego adresu URL bez dodawania wywołania funkcji pośredniej (co na pewno wpływa na wydajność bardziej niż proste połączenie ciągów).

Powiązane problemy