web-dev-qa-db-ja.com

iPhoneアプリのFacebookアクセストークンサーバー側検証

サーバーとの通信に基づいたiPhoneアプリケーションを開発しており、Facebook認証メカニズムを使用したいと考えています。

基本的に、次のように動作するはずです。

  1. 私のiPhoneアプリでは、ユーザーは自分の電子メールとパスワードを使用してFacebookにログインします。
  2. ユーザーは、関連するFacebookアプリケーションのデータへのアクセスを許可します。
  3. ログインに成功すると、iPhoneアプリはアクセストークンを受け取ります。
  4. サーバーとのさらなる通信では、iPhoneアプリケーションは受信したFacebookアクセストークンを使用する必要があります(例:クエリで)。
  5. サーバーがアクセストークンを使用してiPhoneアプリからクエリを受信すると、Facebookにこのトークンが有効であること(および誰に対して)を要求する必要があります。

私の質問は、与えられたアクセストークンが有効かどうかをサーバーがFacebookに問い合わせる方法です。トークンがFacebookアプリで有効かどうかを何らかの方法で確認する必要があると思います。

私は、APIをグラフ化するために多くのFacebookクエリを試しましたが、期待どおりに機能しませんでした。例を挙げていただけますか?

111
Marcin

更新:この回答は安全ではないようですアプリに属していると最初にトークンを検証しないため、コメントを参照してください。元の回答は次のとおりです。

既にアクセストークンを持っていると思います。このような場合、アクセストークンを検証する最も簡単な方法は、次のリクエストを発行することです

https://graph.facebook.com/me?fields=id&access_token=@accesstoken

ここで、@ accesstokenを所有しているアクセストークンに置き換えます。 URLを分類し、それぞれについて説明します。

ここでは、アクセストークンの所有者のFacebookユーザーIDをJSON文字列として返すグラフAPIリクエストを発行しています。キーワード「me」は、現在ログインしているユーザーまたはアクセストークンの所有者を表します。このリクエストでは、アクセストークンは必須パラメーターです。

提供されたアクセストークンが無効または期限切れの場合、Facebookは何らかのエラーメッセージを返します。

有効なアクセストークンの場合、結果は何らかの形で次のようになります。

{
   "id": "ID_VALUE"
}
113
Robin

ユーザーアクセストークンがアプリに属していることを検証するために使用できる2段階のプロセスを次に示します。

1)App Accessトークンを生成します

https://developers.facebook.com/docs/howtos/login/login-as-app/

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID
&client_secret=YOUR_APP_SECRET
&grant_type=client_credentials

2)ユーザーアクセストークンのデバッグ

https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/

https://graph.facebook.com/debug_token?
input_token=INPUT_TOKEN
&access_token=ACCESS_TOKEN

ここで、INPUT_TOKENは確認するユーザーアクセストークンであり、ACCESS_TOKENは手順1で取得したアプリのトークンです。

デバッグエンドポイントは基本的にトークンに関するすべての情報をダンプするため、次のような応答が返されます。

{
    data: {
        app_id: YOUR_APP_ID,
        is_valid: true,
        metadata: {
            sso: "iphone-safari"
        },
        application: YOUR_APP_NAMESPACE,
        user_id: USER_ID,
        issued_at: 1366236791,
        expires_at: 1371420791,
        scopes: [ ]
    }
}

そのトークンが「あなたのアプリ」からのものでない場合、エラー応答を返します。

112

別の解決策は、 ユーザーアクセストークンからアプリケーションIDを取得(またはトークンのソースアプリケーションを確認) で説明されているhttps://graph.facebook.com/app/?access_token=[user_access_token]を使用することです。

これは文書化されていない機能のようですが、トークンが生成されたアプリのIDを含むJSONを返します。トークンがアプリ用ではなかった場合、400を返します。

11

Facebookの最新バージョン(2.2)では、次の方法で実行できます。

https://developers.facebook.com/docs/graph-api/reference/v2.2/debug_token

サンプル出力:

{
    "data": {
        "app_id": "THE APP ID", 
        "application": "APP NAME", 
        "expires_at": 1427245200, 
        "is_valid": true, 
        "scopes": [
        "public_profile", 
        "basic_info", 
        "read_stream", 
        "email", 
        "publish_actions", 
        "read_friendlists", 
        "user_birthday", 
        "user_hometown", 
        "user_location", 
        "user_likes", 
        "user_photos", 
        "user_videos", 
        "user_friends", 
        "user_posts"
        ], 
        "user_id": "THE USER ID"
    }
}
5
private function facebookRequestMe($access_token)
{
    include_once "facebook.php";

    $facebook = new Facebook(array(
        "appId" => "your_application_id",
        "secret" => "your_application_secret"
    ));
    $facebook->setAccessToken($access_token);
    return $facebook->api("/me", "GET");
}

PHPから GitHub のFacebook SDKをダウンロードできます。

2
Baptiste Costa

ユーザーが自分のものであると主張するFacebook UIDを渡した場合、それが正当であるかどうかを確認したい場合、これはPython関数で、アクセストークン(Robinの実装ジョームの答え):

def verify_facebook_id(id, access_token):
    import requests
    import simplejson
    params = {'fields': 'id', 'access_token': access_token}
    text = requests.get("https://graph.facebook.com/me", params=params).text
    json = simplejson.loads(text)
    response_id = json["id"]
    return response_id == id
1
Andrew Magee

これは、1つのリクエストのみを使用してユーザートークンを検証する唯一の安全な方法です。

https://graph.facebook.com/debug_token?input_token={token-to-inspect}&access_token={app_id}|{app_secret}

記号「|」に注意してください上記のURLはORとしてではなく、セパレータとして使用され、他のフィールドに入力した後に存在する必要があります。

応答は、次のようなJSONになります。

{
    data: {
        app_id: {app_id},
        application: {app_name},
        expires_at: {some_number},
        is_valid: {true|false}
        scopes: {array_of_permissions},
        user_id: {user_id}
    }
}

リファレンス: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (上記の方法はこのセクションの最後に記載されています)

1
Kamoris