使用 Javascript API 检索访问令牌
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6126517/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Retrieve Access Token Using Javascript API
提问by Kassem
This is a follow up to the topic: Passing the signed_request along with the AJAX call to an ActionMethod decorated with CanvasAuthorize
这是该主题的后续:将 signed_request 与 AJAX 调用一起传递到使用 CanvasAuthorize 装饰的 ActionMethod
Since I couldn't get the signed_request to be anything other than null, I thought I'd authenticate the user on the client side, then send the access token to the server side (ASP.NET MVC) along with the AJAX call. Unfortunately, I cannot get that to work either! Here's my Javascript code (which I've got from the documentation):
由于我无法将 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");
}
}
});
}
And this is my server-side code:
这是我的服务器端代码:
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);
}
}
UPDATE:
更新:
I tried thisbut it did not work for me. When I click on the button for the first time, it redirects me to the FB login page and then returns me back to my website's home page. After that, all it does is redirect and then back to the home page right away. Nothing gets posted.
我试过这个,但它对我不起作用。当我第一次单击该按钮时,它会将我重定向到 FB 登录页面,然后将我返回到我网站的主页。之后,它所做的就是重定向,然后立即返回主页。什么都不会发布。
Any suggestions?
有什么建议?
回答by Pat James
The Facebook Javascript SDK documentation is here: https://developers.facebook.com/docs/reference/javascript/
Facebook Javascript SDK 文档在这里:https: //developers.facebook.com/docs/reference/javascript/
There are several methods of getting the access token using the Javascript SDK. Some are synchronous, some asynchronous, some let you subscribe to events such as changes in login state, some get the session object (which contains the access token) in response to things like prompting for permissions.
有多种使用 Javascript SDK 获取访问令牌的方法。有些是同步的,有些是异步的,有些让您订阅诸如登录状态更改之类的事件,有些则获取会话对象(其中包含访问令牌)以响应提示权限之类的事情。
Here is one simple example:
这是一个简单的例子:
<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>
Once you have the access token captured client side you can post it in a form or ajax call to the server.
一旦您在客户端捕获了访问令牌,您就可以将它以表单或 ajax 调用的形式发布到服务器。
Another thing to check is your environment. Facebook will look to see if the domain making these api calls matches up with your app settings. Try it on port 80, and with a real domain with DNS that points at your server (not localhost). Use DynDns or some other such service to setup a domain name and DNS entry that points at your dev box. Run IIS on your dev box with your app on port 80 and the firewalls/router port forwarding setup so you can serve your pages on port 80 on a real domain that matches your Facebook app settings.
要检查的另一件事是您的环境。Facebook 将查看进行这些 api 调用的域是否与您的应用设置相匹配。在端口 80 上尝试它,并使用带有指向您的服务器(不是本地主机)的 DNS 的真实域。使用 DynDns 或其他一些此类服务来设置指向您的开发箱的域名和 DNS 条目。在您的开发箱上运行 IIS,并在端口 80 和防火墙/路由器端口转发设置上运行您的应用程序,以便您可以在与您的 Facebook 应用程序设置匹配的真实域上的端口 80 上为您的页面提供服务。