1

我已经将我的网站与 Facebook Connect、授权/单点登录集成在一起,一切都很好。

现在我试图在用户的墙上发布一些东西,我遇到了一些问题。

首先,我使用“旧”JavaScript API(FeatureLoader.js)。

这些是 Graph API URL 使用的即时消息:

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}";

我正在使用TokenExchange_UrlURL 来接收唯一的用户 OAuth 令牌以进行调用。

这工作正常,因为 a) 我收到了返回的令牌,并且 b) 我可以向 Graph API(即UserDetails_Url)发出 HTTP Get 请求并且它工作正常。

但是,我无法使用Feed_Url.

我很确定问题是我没有适当的用户权限发布到墙上(即 facebook 端设置)。

现在,我意识到我可以在fbPublish客户端使用 API 方法来执行此操作,但我想使用 Graph API 在服务器端执行此操作。

我不会费心展示我的代码,它尝试调用 Graph API 来发布到用户的墙上,因为它非常简单(HttpWebRequest、将方法设置为“POST”、设置内容类型/长度、将字节写入流等)。

我认为问题是我需要用户授予我的应用程序“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?为什么有两个不同的 URL 看似获取相同的信息?

是的 - 我已经阅读了 Facebook API doco(无数次),是的,我已经阅读了其他类似的 SO 问题,但是它们都导致使用客户端 API 发布到墙上,我想在服务器端进行。

对于实际的“Facebook Connect”按钮,我使用的是标准 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 是什么?
  • 是否有明确的来源显示如何使用服务器端 Graph API 调用发布到用户的墙上?
4

1 回答 1

4

正如我推测的那样,我错过了对客户端 API 的调用以请求扩展权限。(即发布流)。

我有一个简单的 JavaScript 函数,它作为 FBML 登录控件的“onlogin”属性的一部分执行。

以前,我只是简单地进行重定向(然后在服务器端代码中进行单点登录)。

现在,我正在这样做:

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.

现在服务器端 Graph API 调用一切正常。

所以回答我自己原来的三个问题:

  • 如何授予扩展权限以发布到用户的墙?

答:使用客户端 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}”可能可以用于服务器端身份验证/授权过程。

  • 是否有明确的来源显示如何使用服务器端 Graph API 调用发布到用户的墙上?

答:如果有,我就不必问这个问题了——所以简而言之,答案是否定的。=)

建议任何开始 Facebook Connect 工作的人,尽量避免使用“旧 JavaScript API”。尽可能多地在服务器端(图形 API)做,并且只使用客户端 JavaScript API 进行初始握手(跨域接收器)。

于 2010-07-26T02:24:11.517 回答