我打算使用$facebook->getAccessToken()
,但查看代碼時,如果它無法從getUserAccessToken()
返回結果,它似乎會爲用戶提供應用程序訪問令牌(通過getApplicationAccessToken()
)。如果我是對的,那意味着在某些情況下,將來自getAccessToken()
的訪問令牌傳遞給用戶可能會返回API密鑰。如何安全地向用戶提供帶有PHP SDK的access_token?
如何安全地獲取訪問令牌?
我打算使用$facebook->getAccessToken()
,但查看代碼時,如果它無法從getUserAccessToken()
返回結果,它似乎會爲用戶提供應用程序訪問令牌(通過getApplicationAccessToken()
)。如果我是對的,那意味着在某些情況下,將來自getAccessToken()
的訪問令牌傳遞給用戶可能會返回API密鑰。如何安全地向用戶提供帶有PHP SDK的access_token?
如何安全地獲取訪問令牌?
您可以使用getUser()
確保您在返回訪問令牌之前擁有當前用戶會話。 編輯:正如評論中所提到的,似乎這不適用於Facebook的PHP客戶端功能。用戶的Cookie可以包含他們的用戶ID,但也可以包含無效的(過期的)code
。 PHP客戶端將嘗試將code
交換爲用戶訪問令牌並失敗。所以getUser()
將返回一個用戶ID,而getAccessToken()
將返回一個應用訪問令牌。 getUser()
不是檢查有效用戶訪問令牌的有效方法。
如果您想要特別小心:Facebook應用令牌的所有形式爲<app id>|<some hash, possibly your secret>
。您可以確保您返回的訪問令牌不具有以下格式:
$token = $fb->getAccessToken();
$tokenParts = explode('|', $token, 2);
if ($tokenParts[0] != <your_app_id>) {
return $token;
} else {
return null;
}
我發現即使會話信息無效,getUser有時也會返回我的用戶ID。 –
我最近也注意到了這一點。我不確定您是否發現相同:JS客戶端可以將signed_request放入包含有效用戶標識但包含無效「代碼」(在此流程中交換用戶訪問令牌所需的東西)的cookie中, 。看起來就像FB客戶端處理這個問題一樣。 – bismark
我想我會考慮這個錯誤。我不小心將客戶機密泄漏給任何有過期會話的人。幸運的是,我可以重置它(我做到了),但現在有這個getuser問題。 *嘆*至少我的應用程序的工作正常,如果會議很好。 –