管理網頁版「Facebook 登入」權限

啟動「登入」對話方塊的一大重點,就是選擇您的應用程式想要存取的資料。以下範例都使用了 scope 參數,讓您可以要求存取用戶資料。這些都稱為權限

我們會在權限指南中,深入介紹權限。不過,在處理權限和「登入」對話方塊時,請記住以下幾項重點:

  • 您在對話方塊建立時要求權限。產生的權限組合會隨存取權杖一起傳回。
  • 其他平台可能會有不同的權限組合。例如,您在 iOS 上可以要求取得用戶標註過的地標,但是在應用程式的網頁版中,此體驗並不需要用到這項權限。
  • 您可以等到之後需要更多功能時再新增權限。當您需要新權限時,只要將需要的權限新增到已授予的清單中,再次啟動「登入」對話方塊後,就會要求新的權限。
  • 「登入」對話方塊讓用戶可以拒絕向您的應用程式分享您要求的特定權限。您的應用程式要能夠處理這種情況。請參閱我們的權限對話方塊以瞭解詳情。
  • 應用程式如果要求預設欄位和 email 權限以外的資訊,必須經過 Facebook 審查後才能正式推出。請參閱我們的登入審查文件和一般審查原則以瞭解詳情。

新增權限

使用「Facebook 登入」的最佳作法,就是可以不必同時要求讀取權限和發佈權限。若要支援此功能,您的應用程式可在用戶登入後再要求更多權限。若要這樣做,您只須以要求的新權限啟動「登入」對話方塊即可。

例如,假設您有一個「登入」按鈕使用以下的權限:

<fb:login-button scope="public_profile" onlogin="checkLoginState();">
</fb:login-button>

而如果您檢查 /me/permissions 來瞭解用戶接受後所授予的權限,您會看到以下內容:

{"data":
  [
    {
      "permission":"public_profile",
      "status":"granted"
    }
  ]
}

如果您之後想要新增 email 權限,可以使用 FB.login() 函式再次啟動,如下所示:

FB.login(function(response) {
   console.log(response);
}, {scope: 'email'});

(此函式必須從按鈕的事件處理常式來呼叫,否則可能會遭到瀏覽器快顯封鎖程式封鎖。)

請注意,這只會要求新的權限。如果您接受新權限檢查 /me/permissions,結果將如下所示:

{"data":
  [
    {
      "permission":"public_profile",
      "status":"granted"
    },
    {
      "permission":"email",
      "status":"granted"
    }
  ]
}

請注意,新的 email 權限已新增到獲允許權限的清單中。

再次要求受拒權限

「Facebook 登入」可讓用戶拒絕與應用程式分享某些權限。如果用戶拒絕 user_likes(按讚的內容),檢查 /me/permissions 來找出已授予的權限將產生以下結果:

{
  "data":
    [
      {
        "permission":"public_profile",
        "status":"granted"
      },
      {
        "permission":"user_likes",
        "status":"declined"
      }
    ]
}

請注意,user_likes 權限已從「授予」變成「拒絕」。

您可向已拒絕的用戶要求一次來授予應用程式權限。您應該顯示說明畫面,告訴用戶應該授予權限的原因,然後再次要求。但是,如果您使用上一節描述的方法,「登入」對話方塊將不會要求權限。

這是因為用戶一旦拒絕授予某權限,除非您明確告知「登入」對話方塊要再次要求某個已拒絕的權限,否則該對話方塊不會再次要求該權限。

方法是將 auth_type: rerequest 標示加入 FB.login() 呼叫:

FB.login(
  function(response) {
    console.log(response);
  },
  {
    scope: 'user_likes',
    auth_type: 'rerequest'
  }
);

當您這樣做時,「登入」對話方塊將會再次要求受拒權限。再次要求權限的對話方塊,看起來會很像這一節中出現的對話方塊,但是會讓您再次要求受拒權限。