ユーザーが新しいブログエントリを作成するたびに、ユーザーのFacebookタイムラインへのリンクを公開するように構成できるオーディオブログWebサイトがあります。
これを行うために、ユーザーがFacebookアカウントへのリンクを設定するときに、ユーザーにアプリを承認してもらいます。publish_stream、offline_access、manage_pagesの権限を取得します(これについては後で詳しく説明します)。
すべてのコードはC#ですが、関係するFacebook APIの動作であるため、原則はすべての言語に適用されます。これらすべてを実現するために、 OAuth2とGraphAPIを使用しています。
そのため、アプリIDとシークレットを使用してアプリアクセストークンを取得し、そのトークンを使用してユーザーのタイムラインに公開します。これは正常に機能します(ユーザーがアプリにこれを行うことを既に許可しているため)。また、Graph APIにクエリを実行して、彼らのいいね、友達、その他のさまざまなデータを取得することもできます。
ここに問題があります:
一部のユーザーは、自分のタイムライムと、管理しているページのタイムラインの更新を公開したいと考えています。理論的には、これは単純です。次のURLを使用して、ユーザーが管理するページのAPIをクエリします。https://graph.facebook.com/ {userid} / accounts?access_token = {token}
この呼び出しから返されるJSONには、それらのページのページIDとページアクセストークンが含まれていると言われます。次に、ページアクセストークンを使用して、ページのタイムラインに公開します。
ただし、アプリアクセストークンを使用してこのURLを呼び出そうとすると、 「このリソースを要求するにはユーザーアクセストークンが必要です」というOAuthException102が発生します。
これは、OAuthException 104「このリソースを要求するにはアクセストークンが必要です」(アクセストークンの受け渡しを怠った場合に取得されるもの)、およびOAuthException 190「無効なOAuthアクセストークン署名」(アクセストークンが有効なものでない場合に取得されます)。
したがって、アクセストークンは有効ですが、この特定のURLには無効です。したがって、この特定のフィードにはアプリアクセストークンではなく、ユーザーアクセストークンが必要なようです(私はこれが事実である理由をずっと気にかけていませんが、それはまさにその通りのようです)。
このテーマに関するすべてのFacebookドキュメント(そして私は今までにすべてを読んだはずです)は1つの場所につながります:http://developers.facebook.com/docs/authentication/server-side/、別名「サーバー側認証」フロー」ページ。このページでは、ユーザーを認証ダイアログにリダイレクトし、関連する権限を要求することで、とらえどころのないユーザーアクセストークンを取得する方法について説明しますが、ユーザーの操作なしでこれを実現する必要があり、ユーザーはすでに必要なすべての権限をアプリに与えています。この自動公開はすべて、オーディオの後処理でサーバー側で行われるため、この段階ではユーザーとやり取りできません。
理解できません。アプリアクセストークンを使用して、ユーザーから必要なほぼすべてのデータを取得できるのに(ユーザーが取得の許可を与えたものは何でも)、/ accountsデータに別の(ユーザー)アクセストークンが必要なのはなぜですか?
ユーザーからの追加の操作なしでユーザーの/accountsデータを取得できるようにするユーザーアクセストークンを取得する方法に誰かが光を当てることができますか?