web-dev-qa-db-ja.com

ユーザーアクセストークンからアプリケーションIDを取得します(またはトークンのソースアプリケーションを確認します)

私はこれを見つけました question 、これには答えがありますが、facebookはそれ以来トークン形式を変更しました、今では次のようなものです:

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD

要するに、そこから何も推測することはできません。また、トークンを貼り付けた場合に探している情報を表示する アクセストークンデバッガー を見つけました。これはニースですが、プログラムで行うのに役立ちません。

ポイントは、誰かがユーザーのトークンを取得すると、それを使用してグラフにアクセスできることです。これはアプリケーションで行うことです。アプリケーションによって発行されたトークンを人々が転送していることを確認したいです。別ではありません。

私のアプリケーションフローは次のとおりです。

  1. Facebookからアクセストークンを取得します(特別なものはありません。 here 、サーバー側フローで説明されています)(iPhoneおよびAndroidで使用されていますが、正しく思い出せば同様のフロー))
    [デバイス] <-> [facebook]
  2. そのアクセストークンを使用すると、デバイスはトークンを使用してアプリケーションサーバーにアクセスします。
    [デバイス] <-> [ジョナサンの申請]
    サーバーでアクセストークンをユーザーに添付し、それを使用して、アプリケーションでそのユーザーにアクセス許可を付与します。 (facebook接続を使用してユーザーを認証する)


私のアプリケーションはセキュリティで保護されており、行われたアクセスもFacebookに関係なく認証されますが、!このフローでは、私が特定した脆弱なリンクは、取得したアクセストークンがアプリケーション用に署名されたことを確実に認証できないことです-オフラインで使用するためにトークンをキャッシュするため、100%確実であることを望みません彼らは私のアプリケーション用であり、私の許可を得ています。

だから、私が取得したトークンが私のアプリケーションに関連していることを認証するための(最良の)方法は何ですか(ユーザーに関しては、トークンを使用して/ meにアクセスし、このトークンがどのユーザーであるかを確認します)

トークンを解読する必要はありません(ある種のAESを推測します)。トークンがアプリケーションIDと一致したことを通知するエンドポイントを探しています。

(編集:重要な場合はC#SDKを使用します。しかし、その情報を提供するグラフ/レストコールも同様に優れています:))

58

https://graph.facebook.com/app/?access_token= [user_access_token]

これにより、このトークンが生成されたアプリが返されます。これをアプリのIDと比較できます。

60
Daaniel

アクセストークンを検査するための公式のグラフエンドポイントは次のとおりです。

GET graph.facebook.com/debug_token?
      input_token=[user_access_token]&
      access_token=[app_token_or_admin_token]

応答例:

{
    "data": {
        "app_id": 138483919580948, 
        "application": "Social Cafe", 
        "expires_at": 1352419328, 
        "is_valid": true, 
        "issued_at": 1347235328, 
        "metadata": {
            "sso": "iphone-safari"
        }, 
        "scopes": [
            "email", 
            "publish_actions"
        ], 
        "user_id": 1207059
    }
}

app_token_or_admin_tokenは、Graph API呼び出しを使用して取得できます。

GET graph.facebook.com/oauth/access_token?
     client_id={app-id}
    &client_secret={app-secret}
    &grant_type=client_credentials

そのuser_access_tokenがapp_token_or_admin_tokenを生成したアプリに属していない場合、debug_tokenエンドポイントは失敗します。

関連するFacebookドキュメント:

24
vially

これを保証する文書化された方法は、 appsecret_proof

GET graph.facebook.com/v2.5/me?access_token=[TOKEN]&appsecret_proof=[PROOF]

これにより、有効なトークンであるだけでなく、トークンがアプリに属していることも検証されます。また、ユーザーデータを一度に取得します。

これを使用して、C#で上記のPROOFを導出できます( here から):

public static string ComputeHmacSha256Hash(string valueToHash, string key)
{
    byte[] keyBytes = Encoding.ASCII.GetBytes(key); 
    byte[] valueBytes = Encoding.ASCII.GetBytes(valueToHash);
    byte[] tokenBytes = new HMACSHA256(keyBytes).ComputeHash(valueBytes);
    valueBytes = null;
    keyBytes = null; 

    StringBuilder token = new StringBuilder();
    foreach (byte b in tokenBytes)
    {
        token.AppendFormat("{0:x2}", b);
    }
    tokenBytes = null; 

    return token.ToString();
}

ComputeHmacSha256Hash(accessToken, appSecret);
5
Nuno Cruces

公式のやり方を使わないのはなぜですか?セキュリティに関するFB自身のビデオからのリクエストは次のとおりです。

リクエスト:https://graph.facebook.com/debug_token?input_token={token-to-check}&access_token={app_id}|{app_secret}

応答:"data": { "app_id": {token-app-id}, "user_id": {token-user-id}, ... }

公式ビデオへのリンク: https://www.facebook.com/FacebookforDevelopers/videos/10152795636318553/

時間が見えるようにスクリーンショットを作成しました。興味がある場合は、詳細情報を見つけることができます。

Facebook video screenshot