使用Javascript API检索访问令牌

时间:2011-05-25 14:58:47

标签: javascript facebook facebook-graph-api facebook-c#-sdk

这是对主题的跟进:Passing the signed_request along with the AJAX call to an ActionMethod decorated with CanvasAuthorize

由于我无法使signed_request成为null以外的任何东西,我以为我会在客户端对用户进行身份验证,然后将访问令牌与AJAX一起发送到服务器端(ASP.NET MVC)呼叫。不幸的是,我也无法让它工作!这是我的Javascript代码(我从文档中获得):

function postOnFacebook(msg, itemLink, pic, itemTitle, signedReq) {
    var siteUrl = 'http://www.localhost:2732';

    var appID = 193005690721590;
     if (window.location.hash.length == 0) {
       var path = 'https://www.facebook.com/dialog/oauth?';
       var queryParams = ['client_id=' + appID,
         'redirect_uri=' + window.location,
         'response_type=token',
         'scope=offline_access'];
       var query = queryParams.join('&');
       var url = path + query;
       window.open(url);
     } else {
       var accessToken = window.location.hash.substring(1);   
       var path = "https://graph.facebook.com/me?";
       var queryParams = [accessToken];
       var query = queryParams.join('&');
       var url = path + query;

   // use jsonp to call the graph
       var script = document.createElement('script');
       script.src = url;
       document.body.appendChild(script);   
     }

    $.ajax({
        url: '/Facebook/Share',
        data: {
            'message': msg,
            'link': siteUrl + itemLink,
            'picture': siteUrl + pic,
            'name' : itemTitle,
            'accessToken': accessToken
        },
        type: 'get',
        success: function(data) {
            if(data.result == "success") {
                alert("item was posted on facebook");
            }
        }
    });
}

这是我的服务器端代码:

    public ActionResult Share(string message, string link, string picture, string name, string accessToken)
    {
        if (FacebookWebContext.Current.Session == null)
            return RedirectToAction("Login");

        var fb = new FacebookWebClient(accessToken);
        var postArgs = new Dictionary<string, string>();
        postArgs["message"] = message;
        postArgs["link"] = link;
        postArgs["picture"] = picture;
        postArgs["name"] = name;

        fb.Post("/me/feed", postArgs);
        return Json(new {result = "success"}, JsonRequestBehavior.AllowGet);
    }
}

更新

我试过this,但它对我不起作用。当我第一次点击按钮时,它会将我重定向到FB登录页面,然后将我返回到我网站的主页。之后,它所做的只是重定向,然后立即返回主页。什么都没发布。

有什么建议吗?

1 个答案:

答案 0 :(得分:20)

Facebook Javascript SDK文档位于:https://developers.facebook.com/docs/reference/javascript/

有几种使用Javascript SDK获取访问令牌的方法。有些是同步的,有些是异步的,有些是让你订阅事件,比如登录状态的变化,有些是获取会话对象(包含访问令牌)以响应提示权限等事情。

这是一个简单的例子:

<input id="AccessToken" type="text" value="" />
<div id="fb-root"></div>
<script src="https://connect.facebook.net/en_US/all.js" type="text/javascript"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {

        FB.init({ 
            appId: 'insert your appID value here', 
            cookie: true, 
            xfbml: true, 
            status: true });

        FB.getLoginStatus(function (response) {
            if (response.authResponse) {
                $('#AccessToken').val(response.authResponse.accessToken);
            } else {
                // do something...maybe show a login prompt
            }
        });

    });
</script>

一旦您获得了访问令牌捕获客户端,您可以将其发布到服务器的表单或ajax调用中。

要检查的另一件事是您的环境。 Facebook会查看这些api调用的域名是否与您的应用设置匹配。在端口80上尝试它,并使用指向服务器(而不是localhost)的DNS的真实域。使用DynDns或其他一些此类服务来设置指向开发框的域名和DNS条目。使用端口80上的应用程序和防火墙/路由器端口转发设置在您的开发盒上运行IIS,这样您就可以在与您的Facebook应用程序设置匹配的真实域上的端口80上提供页面。