存取憑證

當用戶使用「Facebook 登入」連結到應用程式時,這個應用程式將能夠取得存取憑證,供用戶暫時且安全地存取 Facebook API。

存取憑證是一種可辨識用戶、應用程式或專頁的不透明字串,可以讓應用程式用來進行 Graph API 調用。 存取憑證可經由許多方法取得,在本文件稍後會介紹各種方法。 由憑證中包含的資訊,可得知這個憑證何時將到期,以及哪個應用程式建立了這個憑證。因為私隱檢查的關係,在 Facebook 上的大多數 API 調用都需要包含存取憑證。不同類型的存取憑證可用來支援不同使用案例:

存取憑證類型 描述

用戶存取憑證

用戶憑證是最常使用的憑證類型。 每當應用程式調用 API 以代表用戶讀取、修改或寫入特定用戶的 Facebook 資料時,就會需要這種類型的存取憑證。 用戶存取憑證通常可經由「登入」對話框取得,且通常會要求用戶允許您的應用程式取得憑證

應用程式存取憑證

若要修改和讀取應用程式設定,就會需要這種類型的存取憑證,此外也可以用來發佈開放式圖表動態。 應用程式存取憑證可使用應用程式與 Facebook 之間預先同意的密鑰建立,之後可在變更應用程式範圍設定的調用期間使用。 您可經由伺服器對伺服器的調用取得應用程式存取憑證

專頁存取憑證

專頁存取憑證和用戶存取憑證類似,不過專頁存取憑證可提供權限給讀取、寫入或修改屬於 Facebook 專頁資料的 API。 若要取得專頁存取憑證,您必須先從取得用戶存取憑證開始,然後要求取得 manage_pages 權限。 當您有了用戶存取憑證之後,就可以經由 Graph API 取得專頁存取憑證

用戶端憑證

用戶端憑證是一種識別碼,您可以將用戶憑證嵌入原生流動應用程式二進位檔或桌面應用程式,以辨識您的應用程式。 由於用戶端憑證嵌入在應用程式內,因此並不是用來當作密鑰識別碼使用。 用戶端憑證可用來存取應用程式級別 API,但只能存取非常有限的子集。用戶端憑證位於您的應用程式管理中心內。因為用戶端憑證很少用到,所以我們將不會在這份文件中討論, 不過可以在任何使用用戶端憑證的 API 文件中找到相關資訊。

產生存取憑證

用戶存取憑證

應用程式存取憑證

專頁存取憑證


用戶存取憑證

儘管每個平台都可經由不同的 API 產生存取憑證,但是所有平台都要遵循基本策略,以取得用戶憑證:

不同平台會有不同的方法來開始這個程序,而且其中所包含的功能,可代表開發人員和授予權限的用戶管理存取憑證:

Javascript

Facebook JavaScript SDK 會自動在瀏覽器 Cookie 中取得用戶存取憑證,並持續保存。您可以調用 FB.getAuthResponse,這樣將會在回應內加入 accessToken 屬性,進而擷取用戶存取憑證。

Android

Android 專用 Facebook SDK 可透過 com.facebook.AccessToken 類別自動管理用戶存取憑證。您可以建置「Android 專用 Facebook 登入」,深入瞭解如何取得用戶存取憑證。您可以檢查 Session.getCurrentAccessToken 來擷取用戶存取憑證。

iOS

iOS 專用 Facebook SDK 可透過 FBSDKAccessToken 類別自動管理用戶存取憑證。您可以建置「iOS 專用 Facebook 登入」,深入瞭解如何取得用戶存取憑證。您可以檢查 FBSDKAccessToken.currentAccessToken 來擷取這個存取憑證。

網頁版(不使用 JavaScript)

在網頁版建立應用程式但不使用 Facebook JavaScript SDK 時,您將須要在文件所列步驟中產生存取憑證。

程式碼範例

Android

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(this.getApplicationContext());
    accessToken = AccessToken.getCurrentAccessToken();
}

iOS

- (void)viewDidLoad
{
  [super viewDidLoad];
  NSString *accessToken = [FBSDKAccessToken currentAccessToken];
}

JavaScript(網頁版)

FB.getLoginStatus(function(response) {
  if (response.status === 'connected') {
    var accessToken = response.authResponse.accessToken;
  } 
} );

短期憑證和長期憑證

用戶存取憑證有兩種形式:短期憑證和長效憑證。 短期憑證的存留期通常約為一到兩個小時,而長效憑證通常有約 60 天的存留期。 這些剩餘的存留期不一定相同,存留期有可能無預警地變更,或提前到期。 請在「處理錯誤」中查看更多資訊。

經由網頁版登入產生的存取憑證是短期憑證,但您可以將他們轉換成長效憑證,方法是使用您的應用程式密鑰,進行伺服器端 API 調用。

根據預設,使用 Facebook 的 iOS 和 Android SDK 的流動應用程式會取得長效憑證。

對 Facebook 推廣 API 使用長效憑證進行標準存取的應用程式,將收到沒有到期時間的長效憑證。這些憑證仍有可能因其他原因而失效,但不會只因時間因素就到期。這點也適用於企業管理平台中系統用戶的存取憑證。

憑證具有可攜式特性

要瞭解存取憑證時,很重要的一點是憑證具有可攜式特性。 當您有了存取憑證之後,可以用來從流動用戶端、網絡瀏覽器,或從您的伺服器,對 Facebook 的伺服器進行調用。 如果憑證是在用戶端上取得,您就可以傳送這個憑證到您的伺服器,然後用在伺服器對伺服器調用。 如果憑證經由伺服器調用取得,您也可以傳送這個憑證給用戶端,然後從用戶端進行調用。

在您的用戶端和伺服器之間移動憑證必須透過 HTTPS 以安全的方式進行,以確保用戶帳戶的安全性。請詳閱在您的用戶端和伺服器之間移動憑證的可能影響

應用程式存取憑證

應用程式存取憑證可用來代表應用程式提出對 Facebook API 的要求,而非代表用戶。這可以用來修改應用程式的參數、建立並管理測試用戶,或閱讀您的應用程式分析報告。

限制

使用用戶存取憑證提出要求的應用程式,通常可能會看到某些用戶資料,但如果使用應用程式存取憑證,就不一定可以看到這些用戶資料。如果您正在應用程式中讀取用戶資料並使用,您應該要使用用戶存取憑證,而非應用程式存取憑證。

如果在應用程式管理中心的進階設定中,您的應用程式設定為 Native/Desktop,就會將應用程式存取憑證視為不安全,因此將不能用於 API 調用。這是因為我們假設原生或桌面應用程式會把應用程式密鑰嵌入某處(因此使用這種密鑰產生的應用程式存取憑證並不安全)。

產生應用程式存取憑證

若要產生應用程式存取憑證,您須要建立 Graph API 調用:

GET /oauth/access_token
    ?client_id={app-id}
    &client_secret={app-secret}
    &grant_type=client_credentials

這個調用將傳回應用程式存取憑證,可用來取代用戶存取憑證,以建立 API 調用,如同前面的說明。同樣,為了安全起見,永遠不應該將應用程式存取憑證硬碼化至用戶端程式碼,因為這樣做有可能讓載入您網頁或反編譯您應用程式的所有用戶,都有存取您應用程式密鑰的完整權限,這些用戶會因此可以修改您的應用程式。 這代表在大多數情況下,您將只能在伺服器對伺服器調用中使用應用程式存取憑證。

請注意:因為這項要求會使用您的應用程式密鑰,所以永遠不應以用戶端程式碼進行,或是以可能被反編譯的應用程式二進位檔進行。請務必注意,永遠不可將您的應用程式密鑰與任何用戶分享。因此,這個 API 調用只應該使用伺服器端程式碼進行。

還有另一種方法,可用來調用不要求使用所產生應用程式存取憑證的 Graph API。 當您建立調用時,可以只傳遞您的應用程式編號和應用程式密鑰,當成 access_token 參數:

https://graph.facebook.com/endpoint?key=value&access_token=app_id|app_secret

是否使用產生的存取憑證,或者使用這個方法,取決於您想將應用程式密鑰隱藏在哪裡。

專頁存取憑證

專頁存取憑證可用在 Graph API 中,以管理 Facebook 專頁。若要產生專頁存取憑證,專頁的管理員必須授予稱為 manage_pages進階權限。取得這項權限後,您就可以使用擁有必要權限的用戶存取憑證以及下列 Graph API 要求,擷取專頁存取憑證:

GET /me/accounts HTTP/1.1
Host: graph.facebook.com

這項要求將傳回這名用戶所管理的專頁清單和專頁的其他相關資訊(例如專頁類別、管理員對這個專頁具有的權限),以及專頁存取憑證:

{
  "data": [
    {
      "category": "Product/service",
      "name": "Sample Page",
      "access_token": "{access-token}",
      "id": "1234567890",
      "perms": [
        "ADMINISTER",
        "EDIT_PROFILE",
        "CREATE_CONTENT",
        "MODERATE_CONTENT",
        "CREATE_ADS",
        "BASIC_ADMIN"
      ]
    }, 
}

使用專頁存取憑證,您便可代替專頁進行 API 調用。例如,您或許可以將近況更新發佈到專頁(而非這名用戶的生活時報),或讀取專頁分析報告資料。

專頁存取憑證對於每個專頁、管理員和應用程式都是獨一無二的。

專頁管理員有不同的角色,可以用以上步驟中傳回的 perms 陣列指定,如上例所示。專頁管理員可用的功能是根據 perms 值(如憑證與角色中所述)而決定。