1

PHPでサーバー側認証として最初にコーディングしたアプリがあります。

ただし、クライアントがサーバーに対してAJAX呼び出しを実行してから、FacebookのuserIdに基づいてデータベースでいくつかのクエリを実行するようにします。userId変数を受け入れることはできません。だれでもそれをスプーフィングできるため、ユーザーのaccessTokenにアクセスする必要があると思います。

ただし、これはサーバー上のPHPファイルへのAJAX呼び出しであるため、例に示されているのと同じサーバー側の認証方法を使用することはできません。

したがって、クライアントはAJAX呼び出しを介してFBアクセストークンを渡す必要があると思います。次に、そのアクセストークンをサーバー側で検証し、それを使用してユーザーのIDと追加情報を取得します。

ただし、サーバー側の認証を使用する場合、クライアントが実際にFacebookからアクセストークンを取得することはなく、サーバーのみがアクセストークンを取得します。つまり、クライアントはアクセストークンを渡すことができません。

私の質問は、元のサーバー側の検証を行ったら、Cookieに基づいてサーバー側のアクセストークンを保存し、その方法でaccess_tokenを取得する必要がありますか?

または、Cookieのなりすましを介してアクセストークンが漏洩することを心配する必要がないように、Facebookアプリのより良い方法はありますか?

4

1 に答える 1

3

まず、アクセストークンをCookieに保存したり、ajax呼び出しを介して送信したりしないでください。アクセストークンは、常に非表示にする必要がある賢明なデータです。

これを行うのに最適な方法かどうかはわかりませんが、常にsignedRequestを使用しています。これは、誰も知らないアプリの秘密で暗号化されているため、サーバーに送信するための安全なデータです...

(FB JS SDKからの)signedRequestをサーバーに渡すと、有効なアクセストークンを取得できます。PHPでは、POSTによってsignedRequestを渡すと仮定すると、次のようになります。

$signed_request = $_POST['signedRequest'];
$data = parseSignedRequest($signed_request);
$token_url= 'https://graph.facebook.com/oauth/access_token?' .
            'client_id=' . YOUR_APP_ID .
            '&redirect_uri='  . // when using the JS signedRequest, leave this blank
            '&client_secret=' . YOUR_APP_SECRET .
            '&code=' . $data["code"];

$response = file_get_contents($token_url);
$params = null;
parse_str($response, $params);
$access_token = $params['access_token']; // here is your access token

次の関数が必要になります。

function parseSignedRequest($signed_request) {
    list($encoded_sig, $payload) = explode('.', $signed_request, 2);
    // decode the data
    $sig = base64UrlDecode($encoded_sig);
    $data = json_decode(base64UrlDecode($payload), true);

    if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
        return 'Unknown algorithm. Expected HMAC-SHA256';
    }

    // check sig
    $expected_sig = hash_hmac('sha256', $payload, YOUR_APP_SECRET, $raw = true);
    if ($sig !== $expected_sig) {
        return 'Bad Signed JSON signature!';
    }
    return $data;
}

function base64UrlDecode($input) {
    return base64_decode(strtr($input, '-_', '+/'));
}

もちろん、アクセストークンをDBに保存する場合は、これを通過する必要はありませんが、トークンの有効期限に注意してください。

ユーザーがすでにアプリを承認していてFacevookにログインしている場合は、CookieからsignedRequestを取得できますが、$_COOKIE[('fbsr_' . YOUR_APP_ID)]このデータはあまり信頼していません...

于 2012-08-02T18:14:40.757 に答える