根据http://github.com/facebook/python-sdk/blob/master/src/facebook.py,在我的画布应用程序中,我可以执行以下调用来获取我的access_token,这将起作用,因为我的用户已使用Facebook登录:
import facebook
myDict = facebook.get_user_from_cookie(cookies, app_id, app_secret)
# my access_token is myDict["access_token"]
myDict是没有,有什么想法吗?
编辑:我在app引擎上运行,通过“canvas”,我的意思是在facebook平台内运行的facebook应用程序。即,它不是我的网站,iPhone或桌面应用程序。我意识到由javascript SDK设置cookie,但据我了解,如果应用程序在facebook内部运行,那么cookie应该已经设置好了。答案 0 :(得分:2)
为此,您需要使用Javascript SDK初始化会话,此时python-sdk能够读取javascript-sdk设置的cookie。
由于您使用的是IFrame画布,因此您无法读取由facebook设置的Cookie。在python-sdk中,有一个示例appengine oauth示例,其中包含了使其工作所需的大部分内容。
答案 1 :(得分:1)
你需要在你的html文件底部放置Facebook javascript SDK ...代码是:
<!-- loads the facebook javascript API asyncroneously and saves the token in a cookie for use in the python code -->
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({appId: '{{ facebook_app_id }}', status: true, cookie: true, xfbml: true});
FB.Event.subscribe('auth.logout', function(response) {
});
FB.Event.subscribe('auth.login', function(response) {
});
};
(function() {
var e = document.createElement('script');
e.type = 'text/javascript';
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
e.async = true;
document.getElementById('fb-root').appendChild(e);
}());
</script>
然后,在您的python处理程序中,您可以执行
cookie = facebook.get_user_from_cookie(self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)
graph = facebook.GraphAPI(cookie["access_token"])
current_user = graph.get_object("me")
这是我自己的应用程序中的一个工作示例
答案 2 :(得分:0)
在您的Facebook应用中,转到“修改设置”=&gt; “迁移”并启用“画布会话参数”。现在,您可以从请求GET参数中获取访问令牌。然后,使用python-sdk通过访问令牌访问图形API。
答案 3 :(得分:0)
要使用跨域Cookie,您必须设置P3P政策。
对于app引擎,您必须设置标题:
self.response.headers['P3P']='CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'
而且你必须使用Facebook Javascript SDK和这样的参数:
FB.init({
appId : '***********',
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true, // parse XFBML
session: 'json_encoded_sessio_getted_on_backen',
channelUrl : location.href+'/channel.html'
});
我发现如果你不在这里开会,FB将不会向你发送cookies iframe。