Новый JS SDK с OAuth 2.0, сохраняющий поддомен в fbsr_ cookie? - PullRequest
8 голосов
/ 26 августа 2011

EDIT: эта ошибка была зарегистрирована и подтверждена как ошибка Facebook . Теперь это исправлено!



Я тестирую свои обновления, чтобы перейти на новый JS SDK. Мое приложение работает в нескольких поддоменах моего домена. На старом JDK я звонил примерно так:

FB.init({
    appId: [APP_ID],
    status: false,
    cookie: true,
    xfbml: true
});
FB.login();

На новом JDK это выглядит так:

FB.init({
    appId: [APP_ID],
    status: false,
    cookie: true,
    xfbml: true,
    oauth:true
});
FB.login();

Используя дополнение FF менеджера файлов cookie, вы можете видеть, что старая версия установила файл cookie на mydomain.com, но новая установила его на www.mydomain.com - то есть мой другой поддомен не может получить доступ к cookie. 1013 *

Чтобы уточнить: проблема в том, что я не могу использовать cookie-файлы facebook на разных поддоменах, а также, если я их регистрирую на каждом поддомене, я должен также выходить из них с каждого поддомена

Ответы [ 4 ]

15 голосов
/ 13 сентября 2011

Если вы установили для oauth значение true при вызове FB.init () через API Javascript, теперь вы получите cookie fbsr_APP_ID вместо cookie fbs_APP_ID (обратите внимание на «r»).Он содержит подписанный запрос и часть миграции oauth.

Если вы используете PHP SDK, он должен позаботиться об изменении.

Однако документы для веб-сайтов, похоже, не обновляются с помощью новой функции get_facebook_cookie (): https://developers.facebook.com/docs/guides/web/

В ней по-прежнему используется старый формат файлов cookie.Вы можете найти, как разобрать подписанный запрос здесь:

http://developers.facebook.com/docs/authentication/signed_request/

Затем вам нужно превратить параметр «code» в cookie в access_token через документы здесь: разработчики.facebook.com/docs/authentication/ (не http: // из-за предотвращения спама в StackOverflow)

Я немного покопался в источнике нового PHP SDK, чтобы выяснить это, поскольку вся документацияне обновляется.

Полный код, который я использую, представляет собой комбинацию вышеперечисленного с небольшими дополнительными модификациями для работы со старым или новым форматом cookie ниже.Новая функция get_facebook_cookie () возвращает несколько дополнительных элементов массива (алгоритм, код, assign_at, user_id), и несколько элементов массива больше не установлены (base_domain, secret, session_key, sig).Основные параметры, которые ищут большинство людей, скорее всего, установлены (uid, access_token и expires)

function get_facebook_cookie($app_id, $app_secret) {
    if ($_COOKIE['fbsr_' . $app_id] != '') {
        return get_new_facebook_cookie($app_id, $app_secret);
    } else {
        return get_old_facebook_cookie($app_id, $app_secret);
    }
}

function get_old_facebook_cookie($app_id, $app_secret) {
    $args = array();
    parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
    ksort($args);
    $payload = '';
    foreach ($args as $key => $value) {
        if ($key != 'sig') {
            $payload .= $key . '=' . $value;
        }
    }
    if (md5($payload . $app_secret) != $args['sig']) {
        return array();
    }
    return $args;   
}

function get_new_facebook_cookie($app_id, $app_secret) {
    $signed_request = parse_signed_request($_COOKIE['fbsr_' . $app_id], $app_secret);
    // $signed_request should now have most of the old elements
    $signed_request[uid] = $signed_request[user_id]; // for compatibility 
    if (!is_null($signed_request)) {
        // the cookie is valid/signed correctly
        // lets change "code" into an "access_token"
        $access_token_response = file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=$app_id&redirect_uri=&client_secret=$app_secret&code=$signed_request[code]");
        parse_str($access_token_response);
        $signed_request[access_token] = $access_token;
        $signed_request[expires] = time() + $expires;
    }
    return $signed_request;
}
3 голосов
/ 16 ноября 2011

Обновление: Facebook обновил ошибку до «Исправлено». Ура!

Это ошибка на Facebook, которая была зарегистрирована, воспроизведена и принята здесь как приоритетная: https://developers.facebook.com/bugs/256155664428653?browse=search_4e843e6d89a232275456793

0 голосов
/ 22 сентября 2011

проверьте это https://developers.facebook.com/apps//summary

посмотрите на домен приложения: часть "Базовая информация:"
, если вы укажете "www.example.com", то это будет работать только для www.example.com.Если вы используете "example.com", он будет обрабатываться как * .example.com и работать для всех поддоменов

0 голосов
/ 22 сентября 2011

1) Проверьте ваше приложение. Домен в настройках установлен как mydomain.com, а не www.mydomain.com
2) Используйте файл канала и URL в init:

FB.init({  
appId : [APP_ID],  
status : false,  
cookie : true,  
xfbml : true,
channelUrl : document.location.protocol + "//domain.com/xd_receiver.html",  
oauth : true
});  

https://developers.facebook.com/docs/reference/javascript/FB.init/

надеюсь, это поможет

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