2013-12-23 13 views
2

現在,當我訪問我的頁面https://example.com並單擊登錄時,它會轉到https://example.com/auth/facebook,然後執行facebook的操作並最終回撥http://example.com/auth/facebook/callback。我似乎無法讓它使用https方案回叫(但僅在請求週期以https開頭時)。PassportJS http和https之間的回撥開關

現在,通過HTTPS IFRAME(Facebook的帆布APP)看時,我得到的錯誤

[鎖定]上的網頁 'https://apps.facebook.com/example/?fb_source=notification&ref=notif&notif_t=app_notification' 加載通過HTTPS,但跑了不安全的內容 'http://example.com/auth/facebook/callback?code=AQD5TUeTP ... yXC0ZM8S45V2iTta629IaquCpAqVUbhAvNCFveaDBlbKg4J4#=': 此內容也應通過HTTPS加載。

passport.use(new FacebookStrategy({ 
    clientID: process.env.FB_CLIENT, 
    clientSecret: process.env.FB_SECRET, 
    callbackURL: "/auth/facebook/callback", 
    profileFields: ['id'] 
},... 

app.get('/auth/facebook', 
    passport.authenticate('facebook', { 
    scope: ["read_stream"] 
    }) 
); 

app.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { 
    failureRedirect: '/#' 
}), 
function(req, res) { 
    res.redirect('/#'); 
}); 

我在Heroku上,在那裏它處理在HTTPS細節運行此。

EDIT 顯然節點提供信息req.connection.encrypted作爲對請求是否是HTTPS。由於我在nginx後面運行的heroku處理所有https之前的節點,因此req.connection.encrypted將始終未定義。

儘管如此,仍然不知道如何解決這個問題。

+1

護照的oauth2策略使用req.connection.encrypted爲ch eck如果它處於安全連接狀態。你可以試着看看它的輸出嗎?也許你實際上是在不安全的連接下運行。 – Jonas

+1

喬納斯,這是一個很棒的評論,謝謝你指出我正確的方向。我在這裏找到了一篇文章:https://groups.google.com/forum/#!topic/express-js/Bm6yozgoDSY,它評論說,由於SSL在Heroku上由nginx處理,因此req.connection.encrypted始終是「未定義的」。關於如何解決這個問題的任何想法? –

+0

喬納斯,那評論讓我想出瞭如何解決這個問題(通過護照代碼挖掘)。如果你能做出回答,我會授予它信譽點。歡迎您將我發佈的答案(在這種情況下,我將在後面刪除)。 –

回答

9

我查看了Passport Oauth2策略代碼,並檢查它是否使用req.connection.encrypted檢查它是否處於安全連接。 它還檢查代理是否在服務器代碼後面運行。如果你知道你在一個代理後面,可以告訴護照去信任一個代理。

看來,由於SSL在Heroku上由nginx處理,因此req.connection.encrypted始終爲「未定義」。 (groups.google.com/forum/#!topic/express-js/Bm6yozgoDSY) Nginx處理Heroku上的所有HTTPS,因此節點永遠不會看到req.connection.encrypted是「undefined」以外的任何其他內容。

爲了解決你必須告訴護照信任代理添加行

app.enable("trust proxy"); 

到您的Express服務器的問題。

0

對不起,這個答案有點蹩腳,我根本不能給你一個基於事物本質的具體答案。

我相信你的facebook api控制檯中的回調鏈接可能是http,如果你將它改爲https,它應該可以工作。

如果不工作,你可以嘗試改變你callbackURL到一個完整的URL("https://example.com/auth/facebook/callback"

+0

關於如何根據請求方案/ url是什麼來動態生成完整的url回調的任何想法?這是我一段時間想到的解決方案之一,但我無法訪問請求,所以我無法弄清楚那些東西。 –

+0

@EliWhite,不,我認爲你不能。另請參閱我的更新答案 –

1

Nginx的處理在Heroku上所有的HTTPS,這樣節點不會看到req.connection.encrypted比不確定的任何其他。通過挖掘passportjs存儲庫,我發現有一個應用程序檢查啓用「信任代理」。要解決此問題,請將

app.enable("trust proxy"); 

添加到您的快遞服務器。

0

我也瞭解到,我們可以通過添加所謂的另一個屬性「代理:真正的」完成同樣的事情到googleStrategy如下面:

passport.use(新GoogleStrategy({ clientID的: keys.googleClientID, clientSecret:keys.googleClientSecret, callbackURL: '/認證/谷歌/回調', 代理:真}

相關問題