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


112

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

基本的には、次のように機能するはずです。

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

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

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


5
ユーザーがFBでアプリからログアウトしていない限り、認証トークンをサーバーに送信するだけで済みます(ssl希望)。グラフAPIを介した "/ me"の単純なクエリは成功または失敗しますか?
マッドゲーマー

フェイスブックから、トークンが無効であるというメッセージが表示されます:)
Jean-Luc Godard

1
私はあなたがやっていることとよく似たことをしようとしています。この質問に回答済みのマークを付けたことはありません。
tempy

access_tokenが期限切れになるとどうなりますか?ユーザーに再度ログインするように依頼する必要がありますか?トークンの有効期限が切れた後で再度検証する方法を理解したい
debianmaster

@debianmasterそれはあなたのアプリのアーキテクチャに依存します。「FBトークンなし-アプリへのアクセスなし」のケースを検討する場合は、「はい」の場合より、ユーザーをログアウトします。そうでない場合は、ユーザーがログインしたままで、Facebookから受信した情報がサーバー/クライアントのアカウントから切り離される「リンク解除」ロジックを検討する場合があります。
Yevhen Dubinin

回答:


115

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

1)アプリアクセストークンを生成する

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: [ ]
    }
}

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


13
Facebookよると、これはトークンを検査する正しい方法です。ただし、管理者やアプリトークンの代わりにアプリIDとシークレットを使用できるため、最初の部分はオプションです。
Brandon Zacharie

@BrandonZacharieどうすればよいかわかりません。アプリIDとシークレットを試してみたところ、「input_tokenパラメータが必要です」というエラーが表示されました
Johnny Z

@JohnnyZ入力トークンが必要です。アクセストークンは柔軟性があります。
Brandon Zacharie、2014

8
@BrandonZacharieそうです、入力トークンとアクセストークンが混同されていました。アプリIDとシークレットを使用するには、これをパイプとして区切り文字としてパラメーターとして渡しました:&access_token = APP_ID | APP_SECRET
Johnny Z


115

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

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

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

ここで、@ accesstokenをお持ちのアクセストークンに置き換えます。私はURLを分解し、それぞれを説明します。

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

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

有効なアクセストークンの場合、結果はどういうわけかこのようになります

{
   "id": "ID_VALUE"
}

14
そのユーザーが別のアプリに属する​​access_tokenを提供した場合、そのリクエストは成功しませんか?
Yuriy

2
有効なユーザーアクセストークンを使用できます(所属するアプリに関係ありません)
Robin

12
@Xiquidこの投稿は、アクセストークンがアプリケーションに属しているかどうかを検証しないため、問題の解決策ではありません。
Kolyunya 2014年

12
この回答の投票数が多い理由がわかりません。それは明らかに正しい解決策ではありません。実際、正しいアプローチは「カニのセバスチャン」が示唆したものです。debug_tokenエンドポイントは、トークン自体に関する情報のクエリに使用されます。これにより、トークンが特定のアプリIDの特定のユーザーIDに属していることを確認できます。
Alex Ntousias

4
ええ、この答えは正しくありません。この方法でアクセストークンを確認すると、誰かが別のアプリケーションからアクセストークンを取得し、それを使用して自分のアプリケーションで認証することができます。
ジョナサン

11

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

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


他のFacebookビジネスの評価を取得するにはどうすればよいですか。これのために何をする必要がありますか?
Maneesh Rao

6

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"
    }
}

これは、リクエストごとにこのfbエンドポイントを呼び出す必要があることを意味しますか?より良い方法はありませんか?
Jdruwe

これは機能しますが、アクセストークンが必要です。「セバスチャンザカニ」の回答を使用してアクセストークンを生成することも、appid | appsecretを使用することもできます。フォアより多くの情報developers.facebook.com/docs/facebook-login/...
クリシュナン

:ここでは、この例の使用だstackoverflow.com/a/16947027/32453
rogerdpack

2
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");
}

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


1

ユーザーがFacebookのUIDを渡したと主張し、彼らが自分のものであると主張し、それが正当かどうかを確認したい場合、これはPythonの関数であり、アクセストークン(Robin Jomeの回答の実装)と照合して検証します。

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

残念ながら、これは「アプリの」トークンが生成されたことを検証しません...
rogerdpack '11

1

これは、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つのリクエストで別の安全な方法があります:stackoverflow.com/a/36555287/32453
rogerdpack

-1

Facebookはアクセストークンとともに、オフセット値である「expires_in」パラメーターも送信します。これを使用して、アクセストークンがNSDateとして期限切れになる時期を計算します。次に、リクエストを行う必要がある場合は、現在の日付と有効期限を比較します。

Facebookが返すステータスコードと応答文字列も調べてみてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.