PHP SDK: Как мне получить токен доступа после аутентификации пользователя? - PullRequest
1 голос
/ 09 сентября 2011

Это приложение для холста на платформе Facebook, использующее новый (est) Facebook PHP SDK.

Мы используем пример PHP из учебника Facebook (https://developers.facebook.com/docs/appsonfacebook/tutorial/), чтобы вызвать диалог OAuth и получитьтестовый пользователь на URL перенаправления.

В URL перенаправления мы используем пример PHP со страницы документов с подписанными запросами Facebook (https://developers.facebook.com/docs/authentication/signed_request/), и наши тестовые пользователи могут успешно авторизовать приложение.

Однако после того, как тестовый пользователь авторизует приложение, мы не можем перехватить токен доступа и срок его действия, его можно увидеть в адресной строке, добавленной к URL-адресу перенаправления, но он не отображается в массиве $ _REQUEST.Если мы добавим {$ access_token = $ facebook-> getAccessToken ();} на страницу URL перенаправления, она покажет значение для токена доступа, но отображаемое значение не является полной строкой токена, которую мы видим при нажатии на ПоказатьТокен на странице «Тестовые роли пользователей» (который, по нашему мнению, является правильным токеном доступа для тестового пользователя).

Вот пример URL перенаправления сдобавлен токен доступа: http://karmakorn.com/karmakorn/alpha20/kk-fb-auth.php#access_token=126736467765%7C2.AQDavId8oL80P5t9.3600.1315522800.1-100002908746828%7CJICJwM1P_97tKmqkEO5pXDCf-7Y&expires_in=6008

Вот что var_dump показывает для массива $ REQUEST для этой же страницы: array (3) {[" _qca"] => string (26)"P0-709927483-1291994912966" ["__switchTo5x"] => string (2) "30" ["PHPSESSID"] => string (26) "euois02ead39ijumca7nffblh2"}

Мы не знаем, почему $ _REQUESTМассив отличается от значений, добавляемых к URL-адресу, и, что более важно, - как получить маркер доступа и срок его действия.

Может кто-нибудь показать нам рабочий пример того, как они собирают эти данные после запуска parse_signed_request (Функция $ signature_request, $ secret) на странице перенаправления?Спасибо!

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Вот соответствующий код из A) нашей тестовой страницы индекса и B) нашей тестовой страницы перенаправления.Если мы используем нашу страницу индекса текста в качестве URL перенаправления, она застревает в бесконечном цикле - потому что пользователь никогда не идентифицируется.

A) Страница индекса

// Create kk-fb app instance
$facebook = new Facebook(array(
    'appId'  => KKFB_ID,
    'secret' => KKFB_KY,
    'oauth' => true,
));

$app_id = KKFB_ID;
$secret = KKFB_KY;
$canvas_auth = 'http://karmakorn.com/karmakorn/alpha20/kk-fb-auth.php';

$auth_url = "https://www.facebook.com/dialog/oauth?" 
                . "client_id=" . $app_id 
                . "&redirect_uri=" . urlencode($canvas_auth) 
                . "&response_type=token" 
                . "&scope=email,publish_stream";

$signed_request = $_REQUEST["signed_request"];

list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

if (empty($data["user_id"])) {
    echo("<script> top.location.href='" . $auth_url . "'</script>");
} else {
    echo ("Welcome User: " . $data["user_id"]);
}

B) Страница перенаправления

// Create kk-fb app instance
$facebook = new Facebook(array(
    'appId'  => KKFB_ID,
    'secret' => KKFB_KY,
    'oauth' => true,
));

$app_id = KKFB_ID;
$secret = KKFB_KY;

$signed_request = $_REQUEST["signed_request"];

list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

$user = $facebook->getUser();
$access_token = $facebook->getAccessToken();

echo "User: $user <br>";
echo "Access Token: $access_token <br>";
echo "Signed Request: $signed_request <br>";
var_dump($_REQUEST);

Вот что показывает эти результаты эхо:

Пользователь: 0 Токен доступа: 126736467765 | ** СЕКРЕТ **Подписанный запрос: array (3) {["_ qca"] => string (26) "P0-709927483-1291994912966" [" _switchTo5x"] => string (2) "30" ["PHPSESSID"] => string (26)" frugi545cdl15gjind1fnv6pq1 "}

Интересно, что когда тестовый пользователь возвращается на страницу индекса, условие if выполнено, и мы можем получить правильный токен доступа:

Приветственный пользователь: 100002908746828 Токен доступа: 126736467765 | 2.AQBgcyzfu75IMCjw.3600.1315544400.1-100002908746828 | m5IYEm976tJAkbTLdxHAhhgKmz8

Очевидно, что мы все еще что-то пропустили!Кроме того, нам нужно научиться получать время истечения как переменную, чтобы мы могли сохранить оба этих значения в нашей базе данных.

Ответы [ 4 ]

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

ОК, давайте попробуем это снова.

На стороне сервера против аутентификации на стороне клиента

Вы используете исключительно PHP SDK, поэтому вы хотите выполнить аутентификацию на стороне сервера, когда код аутентификации отправляется на сервер через HTTP через URL. Это позволит вам получить токен доступа для пользователя при первой загрузке страницы после авторизации (в вашем случае страница перенаправления). В настоящее время создается auth_url, устанавливающий response_type=token, что заставляет перенаправление использовать режим аутентификации на стороне клиента и устанавливать токен во фрагменте URL, а не в запросе. Вы должны полностью удалить этот параметр. На самом деле, я настоятельно рекомендую вам просто использовать PHP SDK вместо того, чтобы создавать этот URL самостоятельно. Смотрите пример ниже.

токены доступа к приложению

Странно выглядящий токен доступа 126736467765 | SECRET - это токен доступа к приложению, который состоит из идентификатора приложения и секретного ключа. Токен доступа к приложению возвращается getAccessToken(), если токен доступа пользователя недоступен (поскольку для некоторых вызовов API требуется по крайней мере какой-либо токен доступа). Это также означает, что вы раскрыли свой секретный ключ миру через это сообщение в блоге, поэтому вам следует сбросить секрет приложения , в противном случае любой сможет совершать вызовы API от вашего имени. Я настоятельно рекомендую вам исключить части ваших токенов доступа, если вы поделитесь ими с другими.

Срок действия токена

Поток OAuth 2.0 и v3.1.1 PHP SDK не позволяют легко определить время истечения токена. Я хотел бы предложить сделать вызов API, а затем обновить токен , если вызов API завершится неудачно с OAuthException. Токены могут быть недействительными, даже если срок их действия не истек, так что это касается большего количества случаев. Однако, если вы все еще хотите сохранить дату истечения срока действия, вы можете просто извлечь ее из самого токена. Если у вас есть токен с истекающим сроком действия, то в этой строке будет указана отметка времени истечения срока действия. Вот функция, которую я быстро собрал, чтобы извлечь это:

function extractExpirationFromToken($access_token) {
    $segments = explode('|', $access_token);
    if(count($segments) < 2) { return 0; }

    $segments = explode('.', $segments[1]);
    if(count($segments) < 4) { return 0; }

    $expires = $segments[3];
    $dash_pos = strrpos($expires, '-');
    if($dash_pos !== false) {
        $expires = substr($expires, 0, $dash_pos);
    }
    return $expires;
}

Новый код индексной страницы

// Create kk-fb app instance
$facebook = new Facebook(array(
    'appId'  => KKFB_ID,
    'secret' => KKFB_KY,
));

$canvas_auth = 'http://karmakorn.com/karmakorn/alpha20/kk-fb-auth.php';

$auth_url = $facebook->getLoginUrl(array(
    'scope' => 'email,publish_stream',
    'redirect_uri' => $canvas_auth, // you could just redirect back to this index page though
));

$user = $facebook->getUser();

if (empty($user)) {
    echo("<script> top.location.href='" . $auth_url . "'</script>");
} else {
    echo ("Welcome User: " . $user);
}

Страница перенаправления

Не думаю, что вам вообще нужна эта страница. Вы можете просто перенаправить пользователя обратно на исходную страницу индекса.

// Create kk-fb app instance
$facebook = new Facebook(array(
    'appId'  => KKFB_ID,
    'secret' => KKFB_KY,
));

$user = $facebook->getUser();
$access_token = $facebook->getAccessToken();
// also copy the function definition given earlier
$expiration = extractExpirationFromToken($access_token);

echo "User: $user <br>";
echo "Access Token: $access_token <br>";
echo "Expiration: $expiration <br>";
echo "Request: <br>";
var_dump($_REQUEST);
2 голосов
/ 09 сентября 2011

Вы можете использовать встроенный метод facebook, например, getAccessToken ();

$access_token = $facebook->getAccessToken();

Это даст вам токен доступа к вашей переменной, теперь, если вы получаете его пустым, не забудьте сначала проверить, правильно ли ловит фид, если это не так, вам может понадобиться проверить ваши настройки, убедитесь, что ваши " «Домен приложения» - эта часть очень важна. После правильной настройки вам необходимо сбросить секрет приложения, а затем установить новые значения в коде авторизации. Надеюсь, это поможет, дайте мне знать:)

оплаченный Также не забудьте оставить область видимости ваших переменных видимой во всем вашем php-файле или классе.

1 голос
/ 09 сентября 2011

Проблема

access_token в вставленном URL-адресе не является частью строки запроса, а вместо этого содержится во фрагменте URL-адреса (после #).Фрагменты URL не отправляются на веб-сервер и доступны для чтения только с помощью клиентского кода, такого как Javascript.Поэтому PHP SDK видит только http://karmakorn.com/karmakorn/alpha20/kk-fb-auth.php,, поэтому $_REQUEST не содержит ключа access_token.

Вопросы / Примечания

  1. Что вы используете дляваш redirect_uri?Я думаю, что вы хотите использовать что-то вроде http://apps.facebook.com/your_canvas_url/
  2. Вам не нужно самостоятельно звонить parse_signed_request или копировать какой-либо код со страницы подписанного запроса.PHP SDK сделает это за вас.Просто позвоните:

    $facebook = new Facebook(array(
        'appId' => '…',
        'secret' => '…',
    ));
    $access_token = $facebook->getAccessToken();
    

Возможные решения

  1. Также используйте Facebook Javascript SDK .Вы можете начать с добавления тега <script> на странице назначения (kk-fb-auth.php) (см. документы для получения полной информации; не забудьте установить oauth: true).JS SDK должен установить файл cookie (с именем fbsr_126736467765), который PHP SDK сможет читать через $_REQUEST или $_COOKIE при последующих загрузках страницы.
0 голосов
/ 09 сентября 2011

Если вы хотите сделать это с PHP, вы можете получить токен доступа пользователя с помощью отдельного вызова Graph API по адресу redirect_uri. Для этого вам нужно изменить response_type вашего $ auth_url на странице индекса на «code» или «code token».

Затем на вашей странице перенаправления Facebook добавит параметр «код» в строку запроса. Этот вызов API вернет вам полный access_token и время истечения:

https://graph.facebook.com/oauth/access_token?
    client_id=YOUR_APP_ID&
    redirect_uri=YOUR_URL&
    client_secret=YOUR_APP_SECRET&
    code=$_REQUEST['code']

Для получения дополнительной информации вы можете обратиться к документам по аутентификации .

...