1

私は自分のウェブサイトをFacebookConnectと統合しました。認証/シングルサインオンは、すべてうまく機能しています。

今、私はユーザーの壁に何かを投稿しようとしていますが、これにはいくつかの問題があります。

まず、「古い」JavaScript API(FeatureLoader.js)を使用しています。

これらは、以下を使用するGraphAPIURLのimです。

private const string UserDetails_Url = @"https://graph.facebook.com/{0}?access_token={1}";
private const string Feed_Url = @"https://graph.facebook.com/{0}/feed?access_token={1}";
private const string TokenExchange_Url = @"https://graph.facebook.com/oauth/access_token?{0}";

URLを使用して、TokenExchange_Url通話を行うための一意のユーザーOAuthトークンを受け取ります。

これは正常に機能しています。これは、a)トークンを受け取り、b)Graph API(つまりUserDetails_Url)にHTTP Getリクエストを発行でき、正常に機能するためです。

ただし、を使用してユーザーのウォールに投稿することはできませんFeed_Url

問題は、壁に投稿するための適切なユーザー権限(つまり、Facebook側の設定)を持っていないことだと確信しています。

fbPublishこれで、クライアント側でAPIメソッドを使用してこれを実行できることに気付きましたが、 GraphAPIを使用してサーバー側で実行したいと思います。

Graph APIを呼び出してユーザーのウォールに投稿しようとするコードを、非常に簡単なものとして表示する必要はありません(HttpWebRequest、メソッドを「POST」に設定、コンテンツタイプ/長さを設定、バイトをStreamに書き込むなど)。

問題は、ユーザーがアプリケーションの「publish_stream」拡張権限を付与する必要があることだと思います。

Facebook Graph API docoは、承認リクエストでこれを行うように指示しています。

https://graph.facebook.com/oauth/authorize?
    client_id=...&
    redirect_uri=http://www.example.com/callback&
    scope=user_photos,user_videos,publish_stream

次のURLを使用してOAuthトークンを取得しているため、混乱します。

https://graph.facebook.com/oauth/access_token?bunchofqsparams

間違ったトークン交換URLを使用していますか?同じ情報を取得しているように見える2つの異なるURLがあるのはなぜですか?

はい-私はFacebookAPIdocoを(何度も)読んだことがあります。はい、他の同様のSOの質問を読んだことがありますが、それらはすべてクライアント側APIを使用してウォールに公開することになります。サーバー側で実行したいと思います。

実際の「FacebookConnect」ボタンには、標準のFBMLを使用しています。

<fb:login-button length="long" size="medium" autologoutlink="false" background="light" onlogin="facebookLogin('/login')" class=" fb_login_not_logged_in FB_login_button FB_ElementReady"><a id="RES_ID_fb_login" class="fbconnect_login_button"><img id="RES_ID_fb_login_image" src="http://static.ak.fbcdn.net/rsrc.php/zB6N8/hash/4li2k73z.gif" alt="Connect"></a></fb:login-button>

これをクリックすると(Facebookにログインしていない場合)、ユーザーがログインできるウィンドウがポップアップ表示されます。ただし、[拡張アクセス許可の要求]ダイアログはありません。または、手動でトリガーする必要がある別のポップアップですか?

要約すると、ここに私の質問があります:

  • ユーザーのウォールに公開するための拡張アクセス許可を付与するにはどうすればよいですか?
  • OAuthトークンを取得するための正しいURLは何ですか?
  • サーバー側のGraphAPI呼び出しを使用してユーザーのウォールに投稿する方法を示すための決定的なソースはありますか?
4

1 に答える 1

4

私が推測したように、拡張アクセス許可を要求するためのクライアント側APIへの呼び出しがありませんでした。(つまり、publish_stream)。

FBMLログインコントロールの「onlogin」属性の一部として実行される単純なJavaScript関数がありました。

以前は、単にリダイレクトを実行していました(これにより、サーバー側のコードでシングルサインオンが実行されます)。

今、私はこれをやっています:

function postLogin(targetUrl) {
   FB.Facebook.apiClient.users_hasAppPermission('publish_stream', function(result) {
        if (result == 0 || result == null) {
            FB.Connect.showPermissionDialog('publish_stream', function() { redirectTo(targetUrl); });
        } else {
            redirectTo(targetUrl);
        }
    });
}

英語に翻訳:

// On "Facebook Connect" click (which passes in a redirect URL)
// Check if user has 'publish-stream' permissions
// If they do, just redirect.
// If they dont, show a dialog requesting that permission, then redirect.

これで、サーバー側のGraphAPI呼び出しはすべて正常に機能します。

だから私自身の元の3つの質問に答えるために:

  • ユーザーのウォールに公開するための拡張アクセス許可を付与するにはどうすればよいですか?

回答:クライアント側のJavaScript API関数「FB.Connect.showPermissionDialog」を使用してポップアップを表示し、「FB.Facebook.apliClient.users_hasAppPermission」を使用してアクセス許可があるかどうかを確認します。

  • OAuthトークンを取得するための正しいURLは何ですか?

回答:まだ「https://graph.facebook.com/oauth/access_token?{0}"」だと思いますが、https://graph.facebook.com/oauth/authorize?{0 }"は可能かもしれません。サーバー側の認証/承認プロセスに使用されます。

  • サーバー側のGraphAPI呼び出しを使用してユーザーのウォールに投稿する方法を示すための決定的なソースはありますか?

回答:もしあれば、私はこの質問をする必要はなかったでしょう-つまり、答えはノーです。=)

Facebook Connectの作業を開始する人へのアドバイスは、「古いJavaScriptAPI」を避けるようにしてください。サーバー側(グラフAPI)でできる限りのことを行い、最初のハンドシェイク(クロスドメインレシーバー)にはクライアント側のJavaScriptAPIのみを使用します。

于 2010-07-26T02:24:11.517 に答える