1

キャンバスアプリの次の状況を想定します。

i)1日目:- read_stream,publish_stream,offline_access権限が必要なFacebookアプリが作成されます。ユーザーが初めてアプリにアクセスしたとき、authorize呼び出しはユーザーを許可の許可/拒否画面にリダイレクトし、ユーザーが許可したときにユーザーをキャンバスのURLにリダイレクトします。

キャンバスURLのリクエストパラメータには、署名されたリクエストのaccess_tokenがあり、アプリの実行に使用できます。

ユーザーが過去にアプリを承認したことがある場合、signed_requestにはacess_tokenが含まれているため、次回アプリにアクセスする同じユーザーに権限ダイアログは必要ありません。

コードは次のようになります。

if(access_token received from signed request)
// do something with user information
else
// redirect user for authorization flow

user_birthday ii)2日目:-ここで、リストにもう1つの権限、 read_stream、publish_stream、offline_access、user_birthday`を追加したいとします。次のロジックで問題が発生します。

  if(access_token received from signed request)
    // do something with user information  <-- the access_token does not have new permission
    else
    // redirect user for authorization flow

API呼び出しはアプリのパフォーマンスに影響を与えるため、この追加の権限の追加に効率的に取り組むにはどうすればよいですか?私は次のようなものを使いたくありません:

https://graph.facebook.com/me/permissions?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

アプリケーションが読み込まれるたびに、トークンに関連する権限を確認します。

アップデート:

良い方法を共有する:アクセス許可セットを、それを受け取ったaccess_tokenと一緒に保存します。例えば。現在のアクセス許可が「basic_details-birthday-publish」(1と呼びます)の場合、access_tokenとアクセス許可セットを次のように保存します。

user  | access_token  | perm_set
Dhruv      sdfsdfsdf       1

これで、設定で、新しいアクセス許可を要求する必要があるときはいつでも、新しいアクセス許可セット「basic_details-birthday-publish-checkins」(2と呼びます)を作成します。

次に、perm_set =1のアクセストークンを持っているユーザーに対してのみアクセス許可ダイアログを表示する必要があります。すでにperm_set=2を持っているユーザーの場合は表示しません。これにより、「/ me/permissions」を使用して各ユーザーのaccess_tokenを確認する必要がなくなります。 api。

4

8 に答える 8

5

それは2段階のプロセスになります:

  1. グラフ パス「/me/permissions」にリクエストを発行して、ユーザーが必要なすべての権限を付与したかどうかを確認します。

  2. ユーザーが必要なすべての権限を付与していない場合は、通常の許可/拒否プロセスを実行する必要がありますが、今回は「スコープ」パラメーターに新しい権限が追加されています。

Edit_:アクセス許可を確認する唯一の信頼できる方法は、/me/permissions を呼び出すことです。

于 2012-01-13T13:00:58.930 に答える
3

まあ、最も効率的なソリューションには、@ Jeff が提案したものに加えて、リアルタイム API を使用する必要があります。
ステップ 1:ユーザーが初めてアプリに「接続」したときのユーザー権限を格納するための権限テーブルを作成します。
ステップ 2:アクセス許可オブジェクトをサブスクライブします。例:

<?php
require '../src/facebook.php';

$facebook = new Facebook(array(
  'appId'  => 'APP_ID',
  'secret' => 'APP_SECRET',
));

$app = get_app_access_token("APP_ID", "APP_SECRET");
parse_str($app);

$realtime_params = array(
    'object'=>'permissions',
    'fields'=>'read_stream,publish_stream', // most recent permissions required by your app
    'callback_url'=>'CALLBACK_URL_HERE',
    'verify_token'=>'STRING_THAT_SHOULD_BE_PRESENT_IN_THE_CALLBACK_PAGE_TOO',
    'access_token'=>$access_token
);

try {
$res = $facebook->api("/APP_ID/subscriptions", "post", $realtime_params);
} catch (FacebookApiException $e) {
echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
}
function get_app_access_token($id,$secret) { 
    $token_url =    "https://graph.facebook.com/oauth/access_token?" .
                    "client_id=" . $id .
                    "&client_secret=" . $secret .
                    "&grant_type=client_credentials";
    return file_get_contents($token_url);
}

詳細については、リアルタイム更新のドキュメントを参照してください。

ステップ 3:ユーザーが権限の 1 つを取り消した場合 (たとえば、publish_stream権限を削除した場合)、コールバック ページは Facebook から送信された投稿要求を処理する必要があります。その場合、Facebook は次のようなメッセージを送信します (リクエストをデコードした後、こちらを参照してください)。

Array
(
    [object] => permissions
    [entry] => Array
        (
            [0] => Array
                (
                    [uid] => 100003355152933
                    [id] => 100003355152933
                    [time] => 1327005647
                    [changed_fields] => Array
                        (
                            [0] => publish_stream
                        )

                )

        )

)

何が変更されたかに関係なく、上記の要求をトリガーとして使用し、/user_id/permissions接続を照会して、権限テーブルを更新します。

これで、次の 2 つのケースができました。

if(access_token received from signed request)
    if(permissions from table are full)
        // do something with user information
    else
        // ask for missing permission and update permissions table
else
    // redirect user for authorization flow
    // upon full authorization, save to the permissions table too

明らかに、他の回答で言われていることも使用する必要があります。常に「try...catch」句を使用し、パーミッション関連のエラーをチェックして、それに基づいて対処する必要があります。

于 2012-01-20T14:50:02.767 に答える
2

3 つの選択肢があり、そのうちの 1 つは、やりたくないと言ったものです。

  1. チェックme/permissionsしてループスルーし、それらすべてがまだ存在するかどうかを確認します。

  2. すべての API 呼び出しを試行/キャッチし、受信したエラーを監視して ( http://fbdevwiki.com/wiki/Error_codesを参照)、#10 API_EC_PERMISSION_DENIED であるかどうかを確認します。その場合は、ユーザーに再度許可を求めてください。

  3. 古いパーミッション セットと下位互換性があるようにアプリを作成して、新しいパーミッションを付与したユーザーに新しい機能のみが表示されるようにします。もちろん、アプリのどの部分を非表示/表示する必要があるかを調べるために、すべての API 呼び出しを試行/キャッチする必要があります。
于 2012-01-16T18:39:39.330 に答える
1

javascriptSDKを使用して権限の入力を求めることもできることを忘れないでください。javascript SDKは、実際にはすべてをインラインで実行します。必要な権限パラメータを使用して「ログイン」関数を呼び出すことができます。すでに付与されている場合は、何も起こりません。

他の人が示唆しているように、グラフで/ me / permitsをクエリできますが、javascriptapiメソッドを使用して情報を取得します。したがって、ユーザーが付与したアクセス許可を保存せず、リアルタイム更新APIにサブスクライブして、それらが最新の状態に保たれるようにする場合は、javascript apiを使用して、クライアント側からすべてをインラインで実行できます。

サーバーが何らかの役割を果たすことをほぼ排除し、ユーザーをjavascriptを介してFacebookに直接リンクします。Facebookは実際にはクライアント側でキャッシュを実行するため、呼び出しは瞬時に行われる可能性があります。

これは、不足している権限の入力を求めるプロンプトに関するFacebookのブログ投稿です。 https://developers.facebook.com/blog/post/576/

于 2012-01-21T19:48:29.680 に答える
1

まず、明白なことを述べます。/me/permissionsエンドポイントを使用する必要があります。アクセス トークンが有効であり、必要な/必要なすべてのアクセス許可を持っているかどうかを確認する唯一の方法です。アプリが読み込まれるたびにこのエンドポイントにヒットしないソリューションが必要だとおっしゃっていたので、先に進みます。

API 呼び出しをチェックしない唯一の方法は/me/permissions、user_id をユーザーのアクセス許可にマッピングする単純なテーブルを使用して、自分のサーバーのアクセス許可を追跡することです。新しいユーザーが承認されると、その fb ユーザー ID と承認されたアクセス許可のリストの行をデータベース テーブルに追加します。彼らが戻ってきたら、必要なすべての権限を持っているかどうかにかかわらず、テーブルで signed_request とルックアップを取得できます。そうでない場合は、追加のアクセス許可を承認し、それらのアクセス許可が付与された場合はテーブルを更新するように求めます。

あなたは既に offline_access を要求しているので、とにかくアクセス トークンをどこかに保存していると思います。そのため、アクセス トークンのアクセス許可のリスト用に別のテーブルを追加しても、追加の負担はそれほど大きくないように思われます。

この設計にはいくつかの明らかな落とし穴があります (FB との不一致) が、主な目的が/me/permissionsエンドポイントを回避することである場合は、これでうまくいくはずです。

于 2012-01-17T06:00:33.667 に答える
0

ここでのすべての回答は、古いfacebook authシステムに基づいています。このシステムでは、有効なsigned_requestパラメーターがない場合、必要なアクセス許可を含むscopeパラメーターを使用してユーザーをoauthurlにリダイレクトします。

オフラインアクセス許可が要求されていない場合は、すべてのユーザーアクセストークンが2時間で無効になるため、問題はありません。したがって、新しい許可でスコープパラメータを変更してから、2時間後に、新しいアクセスごとに、新しいでoauthページにリダイレクトされます。スコープなので、Facebookはそれを正しく処理します。

すでにオフライン権限を取得していて、それが必要なため、ユーザーのアクセストークンが簡単に無効になることはありません(ユーザーがパスワードを変更するか、アプリを非アクティブ化するだけの場合)、前述のソリューションは正しく機能しません。

グラフAPI呼び出しでのアクセス許可エラーのチェックは、ユーザーが要求した内容をユーザーが許可していないかどうかを確認し、ユーザーをリダイレクトしてユーザーにアクセス許可を付与する方法であることを認めます。許容できますが、不要です

これで、Facebookアプリの設定ページで必要な権限を作成できるようになりました。具体的には

https://developers.facebook.com/にアクセスします

アプリを選択します。

左側のメニューの[設定]->[認証ダイアログ]タブをクリックします。そして、すべてのユーザーが確実に許可され、必要な権限でページにアクセスできるようにする必要のある権限を選択します。

ただし、ここで拡張許可を行うことはできません。

したがって、問題に対する唯一の可能な答えは、すべてのアクセストークンを一度に削除することです。これにより、すべてのリピーターが新しいアクセス許可ダイアログにリダイレクトされるようになります。

しかし、このソリューションは、ユーザーベースに関する情報を取得するのに役立ちます。この問題を克服するには、ユーザーがページにアクセスしたときにのみこれをトリガーできるため、アクセストークンを削除した後、ユーザーはおそらくページに再度アクセスします。ただし、このアクセストークンの削除操作の対象となるユーザーを保持するために、すべてのユーザーに対して余分なビットを保持する必要があります。ユーザーがこの操作を受けずにアプリにアクセスした場合は、アクセストークンを削除し、ユーザーを新しい権限でoauthページにリダイレクトします。ユーザーが既に行っている場合は、この種の問題は発生しません。

だから私の答えは上記の選択肢です。ただし、この問題を解決するための最も困難で洗練された方法は、ユーザーがアプリを操作するたびに、アプリの機能を使用するためにアクセス許可を要求することです。これには、ここで説明するアクセス許可が必要です。そうすれば、ユーザーが要求する最初のアクセス許可の長さを恐れることがないため、oauthダイアログのクリック率が上がります。ユーザーは、アプリの使用についてより多くのコンテンツを得ることができます。彼らがあなたのアプリで素晴らしいことをする必要があるときはいつでも、あなたは親切に素晴らしい許可を求めることができます。

幸運を

于 2012-01-18T14:40:38.407 に答える
0

実装の提案。

アクセス許可セットを、それを受け取った access_token と共に保存します。例えば。現在のパーミッションが「basic_details-birthday-publish」(1 としましょう) の場合、access_token とパーミッション セットを次のように保存します。

user  | access_token  | perm_set
Dhruv      sdfsdfsdf       1

ここで、設定で、新しい許可を求める必要があるときはいつでも、新しい許可セット「basic_details-birthday-publish-checkins」を作成します (2 と呼びましょう)。

次に、perm_set = 1 のアクセス トークンを持つユーザーのみにパーミッション ダイアログを表示する必要があり、既に perm_set = 2 を持つユーザーには表示しないようにします。これにより、"/me/permissions" を持つ各ユーザーの access_token をチェックする必要がなくなります。 API。

于 2013-10-25T09:17:37.930 に答える
-1
$facebook = new Facebook(array(
                'appId' => 'xxxxxx',
                'secret' => 'xxxxx',
                'cookie' => true,
            ));
$code = @$_REQUEST["code"];//only get after log in into the app
if(empty($code)) 
{
$dialog_url     = "http://www.facebook.com/dialog/oauth?client_id=" 
                . $app_id . "&redirect_uri=" .  urlencode($canvas_page_url)."&scope=email,read_requests,offline_access,read_mailbox,user_relationships,user_likes,user_online_presence,user_activities,user_status,user_groups,manage_pages,friends_status,read_stream,friends_photos,publish_stream";
 echo("<script> top.location.href='" . $dialog_url . "'</script>");
}
 $token_url         = "https://graph.facebook.com/oauth/access_token?client_id="
                . $app_id . "&redirect_uri=" . urlencode($canvas_page) . "&client_secret="
                . $app_secret . "&code=" . $code;
$access_token   = @file_get_contents($token_url);

上記のコードを試してアプリをリロードすると、追加した追加の権限にアクセスするためのポップアップが表示されます。

于 2012-01-18T08:42:13.593 に答える