アクセストークンを扱う場合は、アクセストークンにどんな情報(ユーザーや有効期限など)が関連付けられているかを確認する必要があります。そのような情報を取得するには、FacebookのデバッグツールまたはAPIエンドポイントを使用します。
APIを使用するには、グラフAPIリクエストを発行します。
curl -i -X GET "https://graph.facebook.com/debug_token? input_token={input-token}& access_token={valid-access-token}
{input-token}
は情報を取得したいアクセストークンに置き換え、{access-token}
は有効なアクセストークンに置き換えてください。これらのトークンは同じアプリのものでなければなりません。
API呼び出しの応答は、次のようなJSON配列になります。
{ "data":{ "app_id":"{app-id}", "type":"USER", "application":"{app-name}", "data_access_expires_at":1576687825, "expires_at":1570820400, "is_valid":true, "scopes":[ "pages_show_list", "public_profile" ], "granular_scopes":[ { "scope":"pages_show_list", "target_ids":[ "{page-1-app-can-access-id}", "{page-2-app-can-access-id}" ] } ], "user_id":"10215241773831025" } }
長期アクセストークンの場合は、issued_at
フィールドも返されます。
Facebookは、アクセストークンが無効になったことを通知しません。expiry
期限をアクセストークンとともにアプリに送信していない限り、アプリでは、APIにリクエストを発行しようとしたときに特定のトークンが無効になったことがわかるだけです。
セキュリティ関連のイベントが原因で、予期される有効期限が切れる前にアクセストークンが無効になることもあります。
ほとんどのアプリで期限切れのトークンを処理する最善の方法は、APIによってスローされるエラーメッセージをキャプチャすることです。発生したエラーごとに、APIはエラーの性質を記述するJSON本文で、エラーメッセージ、コード、サブコードを返します。コードとサブコードの詳細については、エラーコードリファレンスのドキュメントをご覧ください。
{ "error": { "message": "Error validating access token: Session has expired on Wednesday, 14-Feb-18 18:00:00 PST. The current time is Thursday, 15-Feb-18 13:46:35 PST.", "type": "OAuthException", "code": 190, "error_subcode": 463, "fbtrace_id": "H2il2t5bn4e" } }
この応答は、ユーザーがアプリからログアウトしたとき、またはパスワードを変更したときに送信されます。
{ "error": { "message": "Error validating access token: The session is invalid because the user logged out.", "type": "OAuthException", "code": 190, "error_subcode": 460, "fbtrace_id": "H2il2t5bn4e" } }
有効なアクセストークンを取得するには、ユーザーが再度ログインする必要があります。アプリはそのトークンを使って、ユーザーに代わってAPI呼び出しを行うことができます。アプリが新しいユーザーに適用するログインフローによって、アプリでどのような方法を採用するべきかが決まります。
誰かが認証を取り消した場合または誰もアプリを認証していない場合、エラー応答はアプリを初めて使用するユーザーに対する応答と同じになります。
{ "error": { "message": "Error validating access token: User {user-id} has not authorized application {your-app-id}.", "type": "OAuthException", "code": 190, "error_subcode": 458, "fbtrace_id": "H2il2t5bn4e" } } }
一般的に、iOS SDKのAPIエラーは、コールバックに渡されるNSError
インスタンスによって判明します。詳しくは、iOS SDKエラーのドキュメントをご覧ください。
一般的に、Android SDKのAPIエラーは、Requests
のコールバックに渡されるResponse
オブジェクトによって判明します。具体的には、response.getError()
を呼び出してFacebookRequestError
インスタンスを取得できます。
アクセストークンを扱う場合、上記の3つのエラーが最も一般的です。その他のエラーについては、APIエラーリファレンスをご覧ください。