2017-04-18 117 views
1

我想要完成的是通過ajax使用護照進行用戶認證。推薦使用護照的方式是通過GET請求觸發授權過程,該請求使用常規的<a>標籤觸發。成功(或失敗)身份驗證後,將重定向到新頁面。現在,而不是使用HTML鏈接來觸發我想通過ajax做的路線。這裏的問題是,當我嘗試這與第三方身份驗證策略,如passport-facebook我得到一個CORS錯誤:通過ajax的護照認證

XMLHttpRequest cannot load [the facebook auth URL]' has been blocked by CORS policy: 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost:8080' is therefore not allowed access. 

下面是相關的服務器端代碼:

// route for facebook authentication and login 
app.get('/auth/facebook', passport.authenticate('facebook', { scope : ['email'] })); 

// handle the callback after facebook has authenticated the user 
app.get('/auth/facebook/callback', (req, res, next) => { 
    passport.authenticate('facebook', (err, user, info) => { 
    req.login(user, function(err) { 
     if(err) return next(err); 
     return res.status(200).json({ 
     success: "All good man!" 
     }); 
    }) 
    })(req, res, next); 
}); 

雖然在瀏覽器我簡單地做:

axios.get('/auth/facebook').then((response) => { 
    console.log(response); 
}); 

我發現several類似questions但沒有人似乎有一個令人滿意的答案。有沒有辦法實際做到這一點?或者一個聰明的解決方法?也許一種方式仍然發回JSON響應,即使路由是使用HTML鏈接觸發的?

回答

0

我不確定這是可能的。首先,如果Facebook沒有啓用CORS,那麼你可以做的事情不多(除了使用類似JSONP的東西,但也需要啓用)。但更重要的是,我認爲他們進行登錄的方式不是給你回一個你可以使用的令牌,而是存儲一個cookie。爲此,他們需要在自己的領域,你不能用Ajax來僞造。最後,我會想象這是他們建立對用戶信任的方式的一部分,總是顯示相同的登錄/授權表單,所以我會認爲他們會盡其所能阻止你迴避這個問題。

這是所有假設,想法,我沒有使用任何的你提到:)

+0

嗯......聽起來好像是你知道的事我不知道:)雖然他們實際上做的工具正在回饋一個令牌以用於後續的API請求。另外,令我困惑的是,實際的身份驗證過程僅通過服務器發生。在瀏覽器中發生的唯一事情是啓動所述過程(觸發'GET/auth/facebook')。在我的理解中,認證的其餘部分(相同的登錄/認證表單)應該完全相同。但我覺得我在那裏失去了一些東西。無論如何,我認爲我找到了一個沒有AJAX的解決方法:)但是,謝謝! – Flavio

+0

嘿@弗拉維奧,你能分享你的解決方法嗎?我的情況非常相似。 – mdeang2