2012-10-13 3 views
5

私は、ユーザーが自分のLinkedInプロファイルでログインできるように、Passport for Expressの戦略をエクスプレスで使用しています。 4行目でPassport strategy callbackURLの現在のホストを設定するにはどうすればよいですか?

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

が、私は手動で完全なコールバックURLを設定する必要があります。

は、私は、次のコードを持っています。私は生産用と開発用にそれぞれ1つの文字列を使用していましたが、URLは変わっていませんでした。

URLの最初の部分(http://localhost:3000)を自動的に設定するにはどうすればよいですか?私がそれを可能にするexpressまたはappの特性がありますか? app.use(function(req, res){});に行く必要がありますか?

ありがとうございます!私のconfig.jsので

答えて

4

古い質問、おそらくyは新しいバージョンにのみ有効です。誰かがこのに動作している場合しかし、私のように、解決策はcallbackURLでホスト名を指定しないことだけである:

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

することは、我々はx-forwarded-protocolヘッダを信頼するようにシステムに指示する必要があり、リダイレクトこれはHerokuのhttpsのために働くことを得るために、

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

あなたのアプリがルートパス上で実行されていない場合、 '/'の代わりに '/ myapp'で実行されている場合などは、動作しません。 –

0

は、私がcfg.site_urlを持って、それは一つの方法だ、またはあなたがREQオブジェクトを持っている場合は、

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

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

わからないreq.hostで見ることができるあなたの文脈がそこにある。

+0

私は構成文字列で開始しましたが、サーバー名とポートは変更され続けています。私はアプリのレベルにあります - 私が知る限り、reqを得る唯一の方法は、私が言及したapp.useステートメントを追加することです。問題は、すべての要求に対して呼び出されることです。 –

+0

あなたは1つのリクエストに対してミドルウェアを提供することができます。 loadConfigVariable関数内に 'app.get( '/ whatever'、loadConfigVariable、routes.whatever);とapp.locals.whatever = config.whateverのようなものがあります。 – chovy

+0

それは私が避けようとしていたものです。別のルートです。私はPassport自体でその機能を見つけることができるのだろうか? –

0

最終的にURLの部分と実際のポートからコールバックURLを動的に作成することでこれを解決しました。このソリューションはうまくいきませんが、ミドルウェア使用の呼び出しを追加せずに実際のURLを取得する方法を見つけることができませんでした(これは単純な文字列連結以上のパフォーマンスに影響しています)。

関連する問題