【问题标题】:ASP.NET & Facebook Connect - How To Post To User's Wall Using Graph API?ASP.NET & Facebook Connect - 如何使用 Graph API 发布到用户的墙?
【发布时间】:2010-07-26 00:38:34
【问题描述】:

我已将我的网站与 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_Url URL 来接收唯一的用户 OAuth 令牌以进行调用。

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

但是,我无法使用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 文档(无数次),是的,我已经阅读了其他类似的 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 调用将帖子发布到用户的墙上?

【问题讨论】:

    标签: c# asp.net facebook facebook-graph-api


    【解决方案1】:

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

    我有一个简单的 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”。尽可能多地在服务器端(Graph API)做,并且只使用客户端 JavaScript API 进行初始握手(跨域接收器)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多