2016-07-23 69 views
0

我一直在尋找,看看這是否可能一段時間,但還沒有找到任何東西。護照OAuth持票人OR isauthenticated

基本上我使用Passport來處理用戶驗證。當然使用Node.js和Express來處理事物的服務器端。我還使用oauth2orize來允許OAuth和處理API調用。

對於API調用,我使用運行passport.authenticate('bearer', { session: false })的中間件controllerClient.isBearerAuthenticated。然後關閉並運行passport.use("bearer", new BearerStrategy)內部的功能。基本上檢查令牌是否有效並調用回調函數。

對於非API請求和只是普通的網頁,它運行以下中間件來檢查身份驗證。

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()) { 
     return next(); 
    } 
    res.redirect('/'); 
} 

所以這是我的問題。我想允許我的API調用被訪問,如果有不記名令牌req.isAuthenticated() = true。目前我必須選擇是否要使用isLoggedIn中間件或controllerClient.isBearerAuthenticated中間件。我試圖找到一種方法將它們結合成一個或一個語句或其他東西。

我在考慮有多箇中間件功能,因此它調用isLoggedIn然後調用controllerClient.isBearerAuthenticated。但似乎問題在於回調函數會被調用,所以它們都會被調用。我也在研究如何找到一種方法來跳過下一個中間件功能並轉到下一個中​​間件功能,但我無法找到任何相關信息。

我認爲最好的選擇將是找出一種方法來跳過controllerClient.isBearerAuthenticatedIFreq.isAuthenticated() =真。現在可能有更好的方法來做到這一點,如果是這樣,我很樂意聽到它。

但在如何使用中間件進行檢查,看用戶是否通過req.isAuthenticated()controllerClient.isBearerAuthenticated autheroized有什麼建議?或者實現這個目標的最好方法是什麼?

還有一點需要注意。我問this之前的問題,並發現passport.authenticate意味着處理實際的 身份驗證,而不是已經通過身份驗證的用戶。 否則,我只會使用passport.authenticate與 數組護照策略。並且使用connect-ensure-login與我現在正在使用connect-ensure-login或controllerClient.isBearerAuthenticated的問題相同。

非常感謝提前!

回答

0

我能弄清楚似乎正在工作的解決方案。爲了將來的參考和可能有類似問題的人,我會在下面發佈我的解決方案。

使用下面的代碼基本上使一箇中間件功能似乎工作。

function isAuthenticated(req, res, next) { 
    //Checking to see if user is authenticated on the web 
    if (req.isAuthenticated()) { 
     return next(); 
    } 
    //If not checking to see if user is authenticated via Bearer and OAuth 
    else { 
     return controllerClient.isBearerAuthenticated.apply(this, arguments); 
    } 
} 

所以我們只是檢查看看req.isAuthenticated是否等於true。如果是這樣,我們只是返回回調函數,並調用API函數。如果沒有,那麼我們檢查將自動調用下一個函數的controllerClient.isBearerAuthenticated,它看起來像是否成功。如果不是,它會發送Unauthorized,狀態碼爲401.

如果想知道如何更改Unauthorized消息,但希望能夠看到該消息,那該多好。