2012-10-13 198 views
5

Estoy usando la estrategia Passport-Linkedin para Passport con Express, para permitir a los usuarios iniciar sesión con su perfil de LinkedIn.¿Cómo configurar el host actual para la estrategia de pasaporte callbackURL?

Tengo el siguiente código:

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

En la línea 4, que tiene que establecer la URL de respuesta completa manualmente. Tenía una cadena para producción y otra para desarrollo, pero mis URL siguen cambiando, y también lo hacen los puertos (utilizo 2 máquinas para desarrollar).

¿Cómo puedo establecer la primera porción de la URL (http://localhost:3000) automáticamente? ¿Hay alguna propiedad de express o app que me permita hacer eso? ¿Debo recurrir a un app.use(function(req, res){});?

Gracias!

Respuesta

4

Pregunta anterior, posiblemente, respuesta válida solo para las versiones más recientes. Sin embargo, si alguien se queda en esto, como yo, la solución es sólo para no especificar un nombre de host en el callbackURL:

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

Para conseguir que esto funcione para heroku https redirigir, tenemos que indicar al sistema que confiar en los x-forwarded-protocol encabezados , al confiar en el proxy:

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

No funciona si su aplicación no se ejecuta en la ruta de la raíz, por ejemplo, se ejecuta en '/ myapp' en lugar de'/'. –

0

En mis config.js Tengo un cfg.site_url, esa es una manera, o usted podría mirar a req.host

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

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

No está seguro de si tiene un objeto en su req contexto allí.

+0

Empecé con una cadena de configuración, pero los nombres de los servidores y los puertos siguen cambiando. Estoy en el nivel de la aplicación; la única manera de obtener una solicitud, hasta donde yo sé, es agregar esa declaración de app.use que mencioné. El problema es que luego se llama para cada solicitud. –

+0

puede proporcionar un middleware para su única solicitud. Algo así como 'app.get ('/ whatever', loadConfigVariable, routes.whatever);' y 'app.locals.whatever = config.whatever' dentro de la función loadConfigVariable. – chovy

+0

Eso es lo que estaba tratando de evitar: otra ruta. Me pregunto si puedo encontrar esa funcionalidad en Passport. –

0

Eventualmente resolvió esto al construir dinámicamente la URL de devolución de llamada desde partes de la URL y el puerto real. No estoy contento con esta solución, ya que parece no elegante, pero no pude encontrar la forma de obtener la URL real sin agregar una llamada de uso de middleware (que estoy seguro afecta el rendimiento más que una simple concatenación de cadenas).

Cuestiones relacionadas