2012-01-13 2 views
1

はのキャンバスアプリのために次のような状況を想定してみましょう:canvasアプリケーションでsigned_requestでaccess_tokenを取得するにはどうすればいいですか?

i)は1日目: - Facebookアプリは read_stream,publish_stream,offline_access権限を必要とする作成されます。 ユーザーが最初にアプリに来ると、authorizeコールはユーザ を許可/拒否の許可にリダイレクトし、ユーザが許可すると、 はユーザをキャンバスのURLにリダイレクトします。

キャンバスのURLは、その要求の というパラメータで署名付きリクエストでaccess_tokenを持っており、このパラメータを使用してアプリを実行できます。 signed_requestは、ユーザーが が過去にアプリを承認していた場合acess_token含まれているよう

ませ許可ダイアログは、アプリの次 時間に来て、同じユーザーのために必要ありません。さて、私は私のリストへの1つの以上のアクセス許可、user_birthday read_stream、publish_stream、offline_access、user_birthday` 今すぐ次を追加したいとしましょう - :

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

II)一日2:

コードは次のようになりますロジックは、API呼び出しがアプリのパフォーマンスに影響を与える としてどのようにこの追加の権限の追加は、効率的に取り組むことができますか?問題

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 

を持っていますかトークンに関連する権限を確認するたびに

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

アプリケーションの負荷を: 私のようなものを使用したいとは思わないでしょう。

UPDATE: ストア、それを受信したとaccess_tokenは一緒に権限セット:

良い方法を共有します。例えば、 。現在の権限がある場合は、新しい許可を求める必要がある時はいつでも、あなたの設定で、今

user | access_token | perm_set 
Dhruv  sdfsdfsdf  1 

として設定access_tokenはと許可、 ストア(1それを呼び出すことができます)「basic_details-誕生日・公開」、作成

アクセス許可トークンがperm_set = 1で、既に所有しているユーザーではないユーザーのアクセス許可ダイアログを表示する必要があります(新しいアクセス許可を "basic_details-birthday-publish-checkins" perm_set = 2なら、これは "/ me/permissions" APIを使って各ユーザのaccess_tokenをチェックする必要性を取り除きます。

答えて

0

実装の提案。

受信したアクセストークンと共にアクセス許可セットを格納します。例えば、 。現在の権限がある場合は、新しい許可を求める必要がある時はいつでも、あなたの設定で、今

user | access_token | perm_set 
Dhruv  sdfsdfsdf  1 

として設定access_tokenはと許可、 ストア(1それを呼び出すことができます)「basic_details-誕生日・公開」、作成

アクセス許可トークンがperm_set = 1で、既に所有しているユーザーではないユーザーのアクセス許可ダイアログを表示する必要があります(新しいアクセス許可を "basic_details-birthday-publish-checkins" perm_set = 2なら、これは "/ me/permissions" APIを使って各ユーザのaccess_tokenをチェックする必要性を取り除きます。

5

これは、2段階のプロセスのようになります。

  1. チェックユーザがいる場合、グラフのパス「/ ME /権限」

  2. にリクエストを発行することによって、あなたに必要なすべての権限を付与されている場合通常の許可/拒否プロセスを通過するために必要なすべての必要なアクセス許可を与えませんでしたが、今回は「スコープ」パラメータに新しいアクセス許可が追加されています。

Edit_:私はアクセス許可を確認するために知っている唯一の信頼できる方法は、/私/許可を呼び出すことです。

+0

Dhruvは、彼はその特定のチェックをしたくないと言いました。 – DMCS

+0

そのように思っていますが、その答えがあなたの回答にも含まれています。 –

+0

笑、ちょうどそれが最善の方法であることを繰り返す。あなたが見ることができるように、私は自分の3人のうちの1人が彼が彼がしたくないと言った人だと言った。 :) – DMCS

2

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

    me/permissionsをチェックし、すべてがまだ存在するかどうかを確認してください。

  1. すべてのAPI呼び出しを試行し、受信したエラーを監視して(http://fbdevwiki.com/wiki/Error_codesを参照)、#10 API_EC_PERMISSION_DENIEDかどうかを確認します。その場合は、再度ユーザーに権限を尋ねてください。

  2. 古い権限セットと下位互換性があるようにアプリケーションを作成します。そのため、新しい権限が付与されたユーザの新しい機能のみが表示されます。もちろん、すべてのAPI呼び出しをキャッチしてキャッチして、アプリのどの部分を非表示/表示する必要があるかを調べる必要があります。
1

まず、明白なことを述べます。 /me/permissionsエンドポイントを使用する必要があります。これは、アクセストークンが有効で、必要な/必要なすべてのアクセス許可を持っているかどうかを確認する唯一の方法です。あなたは、アプリケーションがロードされるたびにこのエンドポイントに当たっていない解決策が欲しいと言ったので、私は先に進むでしょう。

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

あなたは既にoffline_accessを要求しているので、私はアクセストークンをどこかに保存していると仮定しているため、アクセストークンのアクセス許可一覧のために別のテーブルを追加すると、負担。

このデザインには(FBとの不一致)いくつかの明白な落とし穴がありますが、主な目的が/me/permissionsエンドポイントを避けることになっている場合は、これが有効です。

-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); 

それはあなたが追加し、余分な権限へのアクセスを得るためにポップアップ表示され、上記のコードで試してみて、アプリをリロードします。

+0

この回答は間違っていて、signed_requestを全く使用していません。 – DhruvPathak

+0

私のアプリケーションでこのコードを使用しているので、これは完全に動作します。署名されたリクエストメソッドを使用せずにこの方法でアプリケーションのアクセスを使用することができます。詳細についてはhttp://developers.facebookを参照してください。com/blog/post/480/ –

+0

このコードは、アプリケーションがアクセストークンを要求し、ユーザーがアプリケーションにアクセスするたびに0Auth2.0認証フローを要求します。 signed_requestでは、これは必須ではありません。過去に情報を認証したユーザーは、signed_requestのuser infoやaccess_tokenなどの情報を取得します。詳細については、http://developers.facebook.com/docs/authentication/signed_request/ – DhruvPathak

0

有効なsigned_requestパラメータがない場合は、必要な権限を含むscopeパラメータを使用して、ユーザーをoauth urlにリダイレクトする古いfacebook認証システムに基づいています。

オフラインアクセス許可が要求されていない場合は、2時間以内にすべてのユーザーアクセストークンが無効になるため問題はないため、新しいアクセス権でスコープパラメータを2時間変更すると、新しい範囲でoauthページ、それで、facebookはそれを正しく扱います。

すでにオフラインの許可を取り、あなたがそれを必要とするので(唯一のユーザーがパスワードを変更したり、アプリを無効にした場合)、その後、ユーザーのaccesstokensが簡単にinvalitatedされることはありません、先行するソリューションが正しく動作しません、

私はグラフapiの呼び出しで許可エラーをチェックすることを受け入れることは、ユーザーがあなたの要求を許可していないかどうかを確認する方法です。それが許容されるが、不必要な

今ので、あなたがFacebookアプリの設定ページで、あなたの必要な権限を作ることができ、より具体的に

https://developers.facebook.com/

に行き、アプリを選択してください。

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

ただし、ここでは拡張アクセス許可はできません。

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

しかし、この解決策では、あなたのユーザーベースについての情報を得ることについて、あなたはこの問題を克服することができます。ユーザーがあなたのページにアクセスしたときにのみこれを引き起こすことができます。ページ。しかし、すべてのユーザーに余分なビットを抱かせて、このアクセストークンの削除操作の対象とする必要があります。ユーザーがこの操作を受けずにアプリケーションを訪問した場合は、アクセストークンを削除し、新しい権限でoauthページにリダイレクトするだけです。ユーザーが既にそれを行った場合、この種の問題はありません。

私の答えは上記の選択肢です。しかし、この問題を解決する最も難しくて洗練された方法は、ユーザーがあなたのアプリケーションとやりとりして、あなたがそのアプリケーションの機能を使用するために許可を求めるだけです。こうすることで、あなたが求める最初の権限の長さをユーザが恐れないようにするため、oauthのダイアログCTR率が上がります。ユーザーはあなたのアプリの使用に関するより多くのコンテンツになります。あなたのアプリですばらしいことをする必要があるときはいつでも、すばらしい許可を親切に求めることができます。

幸運

3

まあ、@JeffはリアルタイムAPIを使用してプラスを示唆するものが必要となる最も効率的なソリューション。
ステップ1:ユーザーが初めてアプリケーションに接続するときに、ユーザーのアクセス許可を格納するアクセス許可テーブルを作成します。
STEP 2:Real-time Updatesドキュメントでこの程度

<?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から送信された投稿要求を処理する必要があります。かかわらず、変更されているものの、私は、トリガとして上記の要求を使用して、クエリ/user_id/permissions接続して更新します

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

       ) 

     ) 

) 

:その場合には、Facebookはあなたのようなものを(要求を復号化した後、hereを参照)を送信しますパーミッションテーブル。あまりにも使用すべきか他の回答で述べてきた明らかに

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 

今、あなたは、2例があります。あなたは常に "try ... catch"節を使ってパーミッション関連のエラーをチェックし、それに基づいて行動するべきです!

+1

+1これは(IMHO)非常に良い解決策! –

+0

@BjörnKaiser、ありがとう。追加するだけで、リアルタイム更新を使用する場合は、PHPの最も強力な機能ではないタスクをキューに入れる必要があります。 – ifaour

1

また、javascript SDKを使用して権限のプロンプトを表示することもできます。 javascript SDKは実際にはすべてインラインで行います。必要なパーミッションパラメータで "login"関数を呼び出すことができます。すでに許可されている場合は何も起こりません。

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

あなたは、あなたのサーバーがどんな役割を果たしていなくても、JavaScriptを介してFacebookに直接ユーザーをリンクさせることはほとんどありません。 Facebookは実際にはクライアント側でいくつかのキャッシングを行い、コールは瞬時になる可能性があります。

ここには、不足しているアクセス許可を求めるメッセージが表示されたFacebookのブログ記事があります。 https://developers.facebook.com/blog/post/576/

関連する問題