通过Python SDK获取facebook OAuth access_token似乎不起作用,任何想法?

时间:2010-04-28 05:55:22

标签: python facebook

根据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应该已经设置好了。

4 个答案:

答案 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。