2012-08-28 101 views
1

因此,我正在爲我的網站開發我自己的API--我模仿Facebook JS SDK關於我的系統如何工作。 API客戶端顯示一個按鈕,彈出窗口出現,用戶可以登錄。登錄彈出窗口向開啓者窗口發出一個事件,父窗口現在知道用戶已登錄。這一切都有效。Facebook如何驗證Facebook連接請求?

我難以理解的是他們如何驗證刷新請求是否有效。如果API客戶端需要向服務器發送請求以詢問用戶是否已登錄並且全部使用JS,那麼一切都是透明的。 API客戶端說:「嗨,我是應用程序4jhkk2l3bnm389,是在Facebook上登錄的用戶,並且已通過身份驗證?如果是這樣,您可以向我發送新令牌,以便我可以調用API調用嗎?」 Facebook說:「哦,你是應用程序4jhkk2l3bnm389?是的,用戶已經登錄並允許你訪問他們的信息,這裏是一個訪問令牌。」

但如何防止Facebook的外部應用程序不是可信的應用程序從說:「嘿,I'M實際應用4jhkk2l3bnm389,我發誓我沒有說謊,我能有一個訪問令牌?」

我不知道他們如何確定差異。顯然,如果全部都是通過現代瀏覽器中的AJAX調用完成的,那麼您可以提供Access-Control-Allow-Origin標頭。但是如果一個惡意的客戶使用cURL,那麼我認爲我無法分辨這個區別。 Facebook如何做到這一點?非常感謝一個很好的解釋!謝謝!

回答

1

所有訪問令牌都屬於應用/用戶對,爲了讓Facebook將這樣的訪問令牌返回給應用,必須對這些令牌進行驗證。

應用程序或client_id根據redirect_uri中指定的域進行驗證 - 如果頁面嘗試使用它不擁有的client_id/redirect_uri對,那麼它將不會接收訪問令牌,因爲它將傳遞給有效的redirect_uri(JS SDK使用的機制遵循相同的規則)。

用戶,或UID,在使用cookie的Facebook當您登錄設置驗證。

雖然你可以使用curl容易欺騙CLIENT_ID/REDIRECT_URI對,同樣不適用於UID,如您必須擁有用戶的cookie。如果是這種情況,那麼你可以簡單地授予你自己的應用程序訪問權限。

+0

非常感謝你。所以我想最好的方法是讓API客戶端在他們的服務器上設置一個「刷新cookie」,以某種方式表示用戶。當用戶重新加載頁面時,客戶端會檢查該cookie是否存在。如果確實如此,它會重定向到auth網關,然後使用標記重定向到回調頁面(前提是刷新cookie是正確的。)對我有意義!非常感謝。 – lwansbrough

+0

其實通過這個邏輯,我可以通過AJAX做到這一點,然後我不能嗎?當用戶授權客戶端時保存刷新cookie,在每次頁面加載時調用它,並在每次加載頁面時更改它。 – lwansbrough

+0

@iLoch通過AJAX做什麼? XMLHttpRequest與瀏覽器的其他部分採用相同的同源策略,CORS未啓用此類端點。 –

0

Facebook使用OAuth 2.0進行身份驗證。您可以在這裏找到Facebook如何處理OAuth的詳細信息:https://developers.facebook.com/docs/authentication/。 OAuth有多種不同的使用方式,具體取決於您是在移動設備上,還是在facebook.com上的頁面,或者您的情況,只是facebook.com以外的網頁。最終流程的細節可以在這裏找到:https://developers.facebook.com/docs/authentication/client-side/

基本上,Facebook知道你有哪些應用程序允許查看你的信息。當你運行其中一個應用程序時,他們首先確保你已經登錄到Facebook,然後他們向Facebook請求一個用戶訪問令牌,實質上是說:「嘿Facebook,我不認識這個人,我也不應該。獲取他們的信息?「。然後Facebook在內部尋找,如果它決定這個特定的應用程序應該有權訪問這個用戶的信息,它會發送一個用戶令牌。

這是描述它的簡單方法。身份驗證流程有很多種不同的方式,具體取決於我之前提到過的請求發生在哪種設備上,這是否是facebook.com上的一個頁面等,主要基於您的安全限制。最好仔細閱讀之前提到的Facebook身份驗證文檔,因爲它可能會非常棘手。

+0

我會看看這些鏈接,但我有點覺得你錯過了我的問題 - 也許我沒有足夠的措辭。最基本的問題是,Facebook如何防止腳本欺騙應用程序ID,如果他們不需要客戶端密鑰通過JS API進行身份驗證? – lwansbrough