После авторизации Facebook перенаправляет на мой сайт, но идентификатор пользователя не установлен - PullRequest
2 голосов
/ 22 сентября 2011

Пользователь посещает страницу холста моего приложения, которая направляет его на авторизацию приложения. Затем он перенаправляет их на мой веб-сайт, где я использую PHP SDK для поиска информации о пользователе.

К сожалению, userID возвращает 0 после перенаправления с Facebook.

$fb_user = $facebook->getUser();

Это ТОЛЬКО происходит сразу после авторизации. Если пользователь переходит на другую страницу на моем сайте или перезагружает страницу, возвращается правильный UID, и все работает как положено.

Может ли перенаправление произойти до того, как Facebook завершит авторизацию? Facebook отправляет userID в перенаправлении? (Это можно настроить?)

Ответы [ 3 ]

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

Обходной путь для этой проблемы:

На моей странице холста я получаю доступ к request_ids и добавляю их в строку запроса URL для запроса авторизации.При авторизации параметр request_ids будет перенаправлен на мой веб-сайт.

Javascript по ссылке «авторизовать»:

top.location = "http://www.facebook.com/dialog/oauth?client_id=MY_CLIENT_ID&scope=PERMISSIONS,MORE_PERMISSIONS&redirect_uri=http://www.MY_WEB_SITE.com/?request_ids=<?php echo $_REQUEST['request_ids']; ?>";

Затем на своем веб-сайте я проверяю идентификатор пользователя Faecbook.Если это 0, я ищу параметр request_id.Если там, я делаю вызов API для графа, чтобы получить связанный user_id.Я использую user_id INSTEAD OF для вызова / me:

if ($fb_user===0){ //if Facebook doesn't return the user (the bug)

    $request_ids = explode( ',', $_REQUEST['request_ids'], 1 ); //get the request_ids param, limit this to one since all request_ids will reference the same user_id
    $request_info = $facebook->api('/' + $request_ids[0],'GET'); //get the request info
    $fb_user_profile = $facebook->api('/' + $request_info['to']['id']); // $request_info['to']['id'] is the associated user_id (who the request was sent to)
}
else {
    $fb_user_profile = $facebook->api('/me');
}

При вызове / me ничего не возвращается, поскольку Facebook не возвращает зарегистрированного пользователя.(Ошибка.)

Это немного сводится, но вы поняли ...

0 голосов
/ 02 мая 2013

Обход Адама отлично работает, но по ряду причин он мне не совсем подходит. Мое решение состояло в том, чтобы получить все необходимые пользовательские данные из авторизации JS и записать их в сеанс php. Надеюсь, это кому-нибудь поможет.

Функция аутентификации JS:

FB.login( function( response ) {
    if ( response.authResponse ) {
        FB.api('/me', function( response ) {
            $.ajax({
                url: 'action.php',
                type: 'POST',
                data: {
                    id:             response.id,
                    name:           response.name,
                    birthday:       response.birthday,
                    location_id:    response.location.id,
                    location_name:  response.location.name,
                    gender:         response.gender,
                    email:          response.email
                },
                success: function() {
                    location.href = 'some-page.php';
                }
            });
        });
    } else {
        alert("Please agree to the Facebook permissions.");
    }
}, { scope:'user_location, user_birthday, email, publish_actions' } );

action.php

session_start();
$_SESSION['user_info']['id']                = $_REQUEST['id'];
$_SESSION['user_info']['name']              = $_REQUEST['name'];
$_SESSION['user_info']['birthday']          = $_REQUEST['birthday'];
$_SESSION['user_info']['location']['id']    = $_REQUEST['location_id'];
$_SESSION['user_info']['location']['name']  = $_REQUEST['location_name'];
$_SESSION['user_info']['gender']            = $_REQUEST['gender'];
$_SESSION['user_info']['email']             = $_REQUEST['email'];
0 голосов
/ 22 сентября 2011

Мы получаем это, первая страница после обратного вызова авторизации либо не дает ни пользователя, ни перми, ни обоих. Должно быть зарегистрировано как ошибка

...