6

FB プラットフォームからしばらく離れてから FB アプリの構築に戻ってきましたが、古い offline_access 権限が削除され、有効期限が長いトークンに置き換えられていることがわかりました[1]。

そのため、外部アプリでのスケジュールやアクティビティなどに基づいてデータを Facebook にプッシュする必要がある外部アプリは、期限切れになったロング アクセス トークンに対処する必要があるようです。ユーザーが FB からログアウトすると有効期限の長いトークンも破棄されるようになったため、これはさらに苛立たしいものになりました[2]。

私はまだ解決策を検討している段階ですが、次の 2 つのアイデアが思い浮かびます。

1) 私のアプリが FB 統合を持つユーザーに連絡するたびに、FB で再認証をトリガーするリンクをクリックして、新しいロング アクセス トークンを取得するように求められます。私のユーザーは通常、ロング アクセス トークンの有効期間内に数回連絡を受けるため、必要な限りロング アクセス トークンを効果的に更新し続ける必要があります (アプリに煩わしい摩擦が追加されたとしても)。

2) 1) が常に機能することを保証できないため (たとえば、ユーザーがアプリの電子メール通知の再認証リンクをクリックしないか、Facebook からログアウトするため)、失敗した FB インタラクションも処理する必要があります。それらを保留キューに入れ、ユーザーに電子メールを送信して、ロングアクセストークンを再度付与するよう明示的に依頼します。クールではありませんが、他に選択肢はありません。X が許可を再付与するように依頼した後、彼らが要求に応答しない場合は、タスクをビンに入れ、アプリではなく FB の制限によるものであることを説明するメールを送信する必要があります。繰り返しますが、クールではありません。

認証/明示的なアクセス許可を持つユーザーのアカウントと対話する機能を維持するために、誰かがより良い解決策を考え出す必要がありましたか? あなたが何をしたか、ぜひ聞きたいです。

(もちろん、これはすべて私が FB ToS を再読するのを待っています - これが規則に違反している可能性は十分にあり、それはさらにイライラするでしょう)

編集/更新: プッシュする必要があるデータは、さまざまなソースからサーバーに到着し、適切なユーザーのアルバムにプッシュされるフォト アルバムへの画像です (もちろん、事前に付与された許可があります)。イメージがサーバーに到達した時点で、エンド ユーザーに新しい短い有効期間のトークンを付与してもらうために、Web ベースのエンド ユーザーとのやり取りが行われることを保証することはできません。基本的に、offline_accessこの IMO には本当に理想的でした。

更新 2: 注意: トークンを付与または延長する必要があるときに、ユーザーが必ずしもアプリや Facebook を使用しているとは限らないというのは、私のユース ケースにとって非常に重要です。

[1] https://developers.facebook.com/roadmap/offline-access-removal/ [2] http://developers.facebook.com/blog/post/2011/05/13/how-to--handle -期限切れのアクセストークン/

4

3 に答える 3

4

適切な 2 つのオプションがありますが、3 番目のオプションと、「Facebook にデータをプッシュする必要がある」という特定のシナリオに関連する場合と関連しない場合があるあまり知られていない事実を指摘します。

まず、アプリにモバイル Web またはキャンバスが実装されている場合に利用できるもう 1 つのオプションは、アプリからユーザーへの要求または通知です。ユーザーは、ブックマークのリストでアプリ名の横に小さな通知カウンター インジケーターを受け取ります。それらがリクエストに応答するか、ブックマーク/通知カウンターがそれらをアプリにヒットさせた場合、サーバー側のトークンの更新/拡張プロセスをトリガーできます。このプロセスはユーザーに対して透過的です。ユーザーがまだアプリをインストールしていると仮定すると、ユーザーには何も表示されません。

第 2 に、今日多くの人が offline_access を使用しているのは、単にユーザーのストリームに投稿することです。これだけで十分で、一連の FQL クエリを実行したり、グラフ API で他のアクションを実行したりする必要がない場合は、publish_stream 権限を取得していれば、offline_access や現在のユーザー トークンは実際には必要ありません。publish_stream を使用すると、アプリ アクセス トークンを使用して、ユーザーがオフラインのときに投稿できます。

于 2012-08-04T21:18:53.100 に答える
1

ここに提案として3番目のオプションがあります。

認証されたユーザーごとに、access_tokenとexpires_inがあります(既にデータベースに保存されていると想定します)

1)有効期限に近いトークンを見つけたときに、expires_in値で既存のトークンをチェックするスケジュールされたタスクを記述します。

2)HTTP GET呼び出しによってサーバー側からこのトークンを更新できます(以下のサンプルコード)

requestUrl = "https://graph.facebook.com" + "/oauth/access_token"
            + "?" + "client_id="+facebook_appId 
            + "&"+"client_secret="+facebook_appSecret
            + "&" + "grant_type=fb_exchange_token"
            + "&" + "fb_exchange_token="+currentToken;

            req = WS.url( requestUrl );
            Logger.info("renew token, req.url : %s", req.url);
            req.timeout = 20;
            resp = req.get();

            // access_token=....&expires=5181096
            Map<String, String> respMap = LocoUtils.decodeUrl( resp.getString() );
            token = respMap.containsKey("access_token")? respMap.get("access_token") : "";

            facebookToken.access_token = token;
            facebookToken.expires_in = respMap.containsKey("expires")?LocoUtils.stringToLong(respMap.get("expires")) : 0L;
于 2012-07-31T16:57:09.480 に答える