Получение Facebook OAuth access_token через Python SDK не работает, есть идеи? - PullRequest
1 голос
/ 28 апреля 2010

Согласно http://github.com/facebook/python-sdk/blob/master/src/facebook.py, в моем приложении Canvas я могу сделать следующий вызов, чтобы получить свой access_token, который будет работать, потому что мой пользователь использовал Facebook для входа в систему:

import facebook 

myDict = facebook.get_user_from_cookie(cookies, app_id, app_secret)
# my access_token is myDict["access_token"]

myDict - это уже None, есть идеи?

РЕДАКТИРОВАТЬ: я работаю на движке приложения. Под холстом я подразумеваю приложение для Facebook, которое запускается внутри платформы Facebook. То есть его нет на моем webiste, iphone или в настольном приложении. Я понимаю, что именно Javascript SDK устанавливает cookie, но, насколько я понимаю, если приложение работает внутри Facebook, файлы cookie уже должны быть установлены.

Ответы [ 4 ]

2 голосов
/ 18 июня 2010

Чтобы это работало, вам нужно использовать Javascript SDK, чтобы начать сеанс, и в этот момент python-sdk может читать файлы cookie, как установлено javascript-sdk.

Поскольку вы используете холст IFrame, файлы cookie, установленные на Facebook, не читаются вами. В python-sdk есть пример приложения oauth, который включает в себя большую часть того, что вам нужно для его работы.

1 голос
/ 09 августа 2011

Вам нужно иметь javascript SDK Facebook внизу вашего html-файла ... код:

<!-- 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")

Это рабочий пример из моего собственного приложения

0 голосов
/ 27 мая 2011

Чтобы использовать междоменные куки, вы должны установить политики P3P.

Для движка приложения вы должны установить заголовок:

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 не отправит вам файлы cookie iframe.

0 голосов
/ 19 августа 2010

В приложении Facebook перейдите в «Изменить настройки» => «Миграции» и включите «Параметр сеанса Canvas». Теперь вы можете получить токен доступа из параметров запроса GET. А затем используйте python-sdk для доступа к API графа с токеном доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...