0

我已經閱讀了FB文檔的一個負載,但仍然無法正常工作。Facebook客戶端身份驗證 - 來自OAuth對話框的http或https重定向

我有一個FB應用程序在IFrame中運行。我正在使用JS SDK來驗證用戶。所以如果用戶之前沒有使用我的應用程序,我需要提示他們授權。

我嘗試使用FB.Login()但這有兩大問題:

  1. 它會打開一個彈出這是醜陋
  2. 我想在登錄屏幕自動顯示(即無需用戶再進行一次點擊)

因此,我嘗試重撥到客戶端上的OAuth對話框。爲此,必須在頂部窗口中打開OAuth url,這意味着我需要將redirect_uri作爲apps.facebook.com/myapp傳遞。

問題是,如果我使用https作爲原型,這隻會起作用。但如果用戶已經通過http使用Facebook,我不想將它們切換到https。

這裏是我的代碼:

window.fbAsyncInit = function() { 
    FB.init({ 
     appId: 1234567890, 
     channelUrl: "//mydomain.com/channel.html", 
     status: true, 
     cookie: true, 
     xfbml: true 
    }); 

    FB.Event.subscribe('auth.statusChange', function (response) { 
     console.log(response); 
     if (response.status === "connected") { 
      // User has authorized app 
     } else if (response.status === "not_authorized") { 
      var url = "//www.facebook.com/dialog/oauth?"; 
      var queryParams = ["client_id=1234567890", 
        "redirect_uri=//apps.facebook.com/myapp", // NOT WORKING 
        "response_type=token"]; 
      var queryString = queryParams.join("&"); 
      url += queryString; 
      window.top.location = url; 
     } 
    }); 
}; 

有沒有使用OAuth對話框中使用客戶端的流量進行身份驗證的方法嗎?或者我是以完全錯誤的方式進行討論的?

(PS我不想使用服務器側的流動,因爲根據Facebook的C#SDK的V6,推薦的方法是授權客戶端上並且從客戶端傳遞的access_token到服務器)

+0

_「redirect_uri = // apps.facebook.com/myapp」,// NOT WORKING_ - 是你的主問題?如果是這樣,您可以輕鬆地讀出用JS在iframe中請求應用程序URL的協議,它位於_location.protocol_屬性中。 – CBroe

+0

如何閱讀協議?該應用程序在IFrame中,根據定義,它不在Facebook上。所以同源策略阻止我從頂部窗口讀取URL。這正是我需要的,請詳細解釋如何做到這一點。 – njr101

+0

我寫道:「用於在iframe中請求_your應用的URL_的協議」...如果用戶通過HTTPS瀏覽Facebook,那麼將調用您的應用的HTTPS版本;如果他只使用HTTP,那麼它就是你的應用程序的HTTP版本。因此,通過嚴格的數學邏輯,我們可以從中推導出:應用協議== Facebook協議。你讀過前者,你可以在不違反SOP的情況下做到這一點,並且知道將用戶發送到Facebook時使用哪一個...不是很簡單,一旦你思考它...? – CBroe

回答

0

"redirect_uri=//apps.facebook.com/myapp", // NOT WORKING

- 是你的主要問題?如果是這樣,你可以輕鬆地讀出用JS在iframe中請求你的應用程序URL的協議,它位於location.protocol屬性中。是的,你的應用程序使用的協議匹配用戶用於衝浪到Facebook網站;-)

0

我建議你不要聽「Facebook C#SDK的v6」。

你所描述的你想要做的事情是拼寫「服務器端認證流程」。
你應該做的是實現服務器端的流量,那麼當用戶的土地在您的應用程序,服務器身份驗證後,您加載FB JS SDK並獲得客戶端令牌是這樣的:

FB.getLoginStatus(function(response) { 
    if (response.status === "connected") { 
     // response.authResponse has everything you need like signed request, access token, etc 
     // you can also make FB.api request or use FB.ui which will use the client side token 
    } 
    else { 
     // user is either logged out of facebook or hasn't authenticated your app 
     // should not happen if the user went through the server side authentication 
    } 
}); 

此代碼不要求用戶與頁面交互,因爲它不會彈出一個新窗口。
請注意,您的應用程序的客戶端部分將使用與您在服務器上應具有的令牌不同的令牌,並且這兩個令牌將具有不同的到期時間(服務器在客戶端很短時壽命已滿)。
在我看來,這種方法更好更安全,因爲它不要求您將身份驗證數據從客戶端發送到服務器或以其他方式發送。

+0

感謝您的建議。我意識到我可以使用服務器端流程,但我希望避免它,因爲C#SDK建議不要這樣做。這讓我覺得他們很快就會棄用服務器端流量的支持。 – njr101

+0

他們會棄用它,但你可以自己實現這個功能,這不是一個艱鉅的任務 –

相關問題