FB.getLoginStatus()を使うと、ユーザーがFacebookにログインしているかどうか、またアプリを認証したかどうかを判別できます。ユーザーの状態としては、次の3つの可能性があります。
connected)not_authorized)unknown)アプリは、ページ読み込み時にまず、ユーザーがこれらの3つのうちのどの状態にあるかを把握する必要があります。
ユーザーが該当アプリを認証したかどうかを判別するには、次のようにします。
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
// The user is logged in and has authenticated your
// app, and response.authResponse supplies
// the user's ID, a valid access token, a signed
// request, and the time the access token
// and signed request each expire.
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
} else if (response.status === 'not_authorized') {
// The user hasn't authorized your application. They
// must click the Login button, or you must call FB.login
// in response to a user gesture, to launch a login dialog.
} else {
// The user isn't logged in to Facebook. You can launch a
// login dialog with a user gesture, but the user may have
// to log in to Facebook before authorizing your application.
}
});
ユーザーが該当アプリを認証した場合、応答オブジェクトは次のようになります。
{
status: 'connected',
authResponse: {
accessToken: '...',
expiresIn:'...',
signedRequest:'...',
userID:'...'
}
}
場合によってはauthResponseを受け取ることがありますが、アプリには、それ以上の呼び出しを行うための認証は与えられません。これは、アプリが設定から削除されたものの、JS SDKを使うウェブページが更新されなかった場合に発生することがあります。そのため、応答ステータスメッセージでこの問題もチェックしてください。
authResponseオブジェクトが存在しない場合、ユーザーはFacebookにログインしていないか、該当アプリを認証していないかのいずれかです。
authResponseオブジェクトのうち最も有用な部分は、userID(ユーザーのID)とaccessTokenです。アクセストークンを使うことにより、そのユーザーの代わりにFacebook APIにリクエストすることができます。userIDは、アプリ内に存在するユーザーのユニークな識別情報です。
アプリのパフォーマンスを向上させるため、ユーザーのステータス確認を呼び出したとしても、Facebookのサーバーにリクエストが送られるとは限りません。応答は可能であればキャッシュに入れられます。現在のブラウザーセッションで初めてFB.getLoginStatusが呼び出された時点、またはJS SDKがstatus: trueを指定して初期化された時点で、応答オブジェクトはSDKによってキャッシュに入れられます。それ以降にFB.getLoginStatusが呼び出された場合、キャッシュに入れられたこの応答のデータが返されます。
これは、最後のフルセッション検索以降にユーザーがFacebookにログイン(またはログアウト)した場合や、ユーザーがそれぞれのアカウント設定から該当アプリを削除した場合に問題を引き起こすことがあります。
そのような問題を回避するため、FB.getLoginStatusを呼び出す際に第2パラメーターをtrueに設定することで、Facebookへのラウンドトリップが強制実行されるようにしてください。こうすることで、応答オブジェクトのキャッシュが効率的に更新されます。
FB.getLoginStatus(function(response) {
// this will be called when the roundtrip to Facebook has completed
}, true);
ページ読み込みのたびにFB.getLoginStatusを呼び出す場合、各ページにパラメーターを設定しないようにしてください。そうすると、Facebookのサーバーへのリクエスト回数が激増し、アプリのパフォーマンスが下がってしまうからです。
FB.getLoginStatusはいつでも(ユーザーがソーシャル関連のアクションの実行を試みた場合などに)呼び出すことが可能ですが、ほとんどのソーシャルアプリでは、ページ読み込み後のできるだけ早いタイミングでユーザーのステータスを把握する必要があります。その場合、FB.getLoginStatusを明示的に呼び出す代わりに、FB.initを呼び出す際にstatus: trueを設定すればユーザーのステータスを確認できます。
この呼び出しの応答を受け取るには、auth.statusChangeイベントのサブスクリプション登録が必要です。このイベントから渡される応答オブジェクトは、FB.getLoginStatusを明示的に呼び出した場合に返されるものと同一です。
JS SDKによって起動される認証イベントをサブスクリプション登録するということは、ユーザーのセッション状態に変化があった場合に該当アプリが通知を受け取ることを意味しています。こうした通知が重要なのは、セッション状態が、アプリの管理が及ばないユーザーインタラクションによって変化することがあるからです。このような変化についてアプリが通知を受け取る唯一の方法が、イベントをサブスクリプション登録することです。
ユーザーの状態を変える可能性があるインタラクションには、FB.login()、FB.logout()、[ログイン]ボタンなどがあります。コメントプラグインなどのウィジェットでも、認証がトリガーされることがあります。
このイベントは、該当アプリでユーザーが最初に認識された時点で(つまり有効なセッションがまだない状態でセッションを取得した場合に)起動されます。
このイベントは、有効なユーザーがいなくなったことをアプリで認識した時点で(つまりセッションはあるが現在のユーザーを検証できなくなった時点で)起動されます。
このイベントは、認証関連のすべての変化に関して起動します。ログイン、ログアウト、セッション更新など、こうした変化はすべてセッションに影響するからです。ユーザーがアプリで活動している限り、時間の経過と共にセッションは更新されます。
一般的には、auth.authResponseChangeイベントを使います。しかしまれに、次の3つの状態を区別したい場合があります。
これらのイベントのサブスクリプション登録には、FB.Event.subscribe関数とFB.Event.unsubscribe関数を使います。以下はその例です。
FB.Event.subscribe('auth.login', function(response) {
// do something with response
});
これらのイベントに対して返される応答オブジェクトは、いずれもFB.getLoginStatus、FB.login、またはFB.logoutからの応答と同じです。この応答オブジェクトの内容は、次のとおりです。
status
ユーザーのステータス。connected、not_authorized、unknownのうちのいずれか1つ。
authResponse
authResponseオブジェクト。
認証のさまざまなメソッドを使うには、アプリがアプリドメインで構成されている必要があります。アプリ設定は、設定ページで変更できます。
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
cb | 関数 | はい | コールバック関数。 |
force | ブーリアン | はい | ログインステータスの再読み込みを強制実行する(デフォルトは |