ウェブ向けのFacebookログインでのアクセス許可の管理

ログインダイアログの起動において最も重要な工程の1つが、アプリがアクセスするデータの選択です。以下のすべての例では、scopeパラメーターを使用しています。これらは、利用者のデータへのアクセスをリクエストする方法です。これらはすべてアクセス許可と呼ばれます。

アクセス許可については、アクセス許可ガイドに詳しい説明があります。ただし、アクセス許可とログインダイアログを扱うときに覚えておくべき事柄がいくつかあります。

  • ダイアログの作成時にアクセス許可をリクエストします。結果として得られるアクセス許可のセットは、返されるアクセストークンに関連付けられます。
  • 他のプラットフォームには、異なるアクセス許可のセットが存在する場合があります。たとえば、iOSでは、利用者がタグ付けされている場所をリクエストできますが、アプリのウェブバージョンでは、そのアクセス許可はエクスペリエンスに必要ありません。
  • 後ほどさらに機能が必要になったときに、アクセス許可を追加できます。新しいアクセス許可が必要な場合は、付与済みのリストに必要なアクセス許可を追加し、ログインダイアログを再起動するだけで、新しいアクセス許可がリクエストされます。
  • ログインダイアログを通して、利用者はリクエストされた特定のアクセス許可をアプリと共有することを拒否できます。アプリはこのケースを処理する必要があります。詳しくは、アクセス許可ダイアログをご覧ください。
  • デフォルトのフィールドおよびemailアクセス許可以外の情報をリクエストするアプリは、一般公開される前にFacebookのレビューを受ける必要がありますログインのレビューとFacebookの一般的なレビューガイドラインについては、Facebookのドキュメントで詳細をご確認ください。

アクセス許可の追加

Facebookログインのベストプラクティスの1つは、読み取りアクセス許可と公開アクセス許可を同時にリクエストしないことです。これをアプリに適用するには、利用者がログインした後で、追加のアクセス許可をリクエストします。そのために必要なのは、リクエストしている新しいアクセス許可でログインダイアログを起動することだけです。

たとえば、次のアクセス許可を含むログインボタンがあるとします。

<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が付与されず、却下されたことがわかります。

利用者がアプリに対して却下したアクセス許可の付与を一度だけリクエストできます。その場合は、アクセス許可の付与が必要な理由を説明する画面を表示して、再リクエストします。ただし、前のセクションで説明した方法を使用している場合、ログインダイアログはそのアクセス許可をリクエストしません。

これは、利用者がアクセス許可を一度却下した場合、却下されたアクセス許可の再リクエストを明示的にダイアログに表示しない限り、ログインダイアログが同じアクセス許可を再リクエストすることはないからです。

再リクエストを行うには、FB.login()呼び出しにauth_type: rerequestフラグを追加します。

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

これにより、ログインダイアログは却下されたアクセス許可を再リクエストします。このダイアログは、アクセス許可の再リクエストに関するセクションのダイアログと非常によく似ていますが、これは却下されたアクセス許可を再リクエストするために使用するものです。