Аутентификация на холсте Facebook: нет параметра signature_request после перенаправления - PullRequest
4 голосов
/ 01 августа 2011

На моей странице холста я пытаюсь аутентифицировать пользователя так, как это описано в http://developers.facebook.com/docs/guides/canvas/,, используя, по сути, этот код (пример кода с developers.facebook.com):

<?php 

 $app_id = "YOUR_APP_ID";

 $canvas_page = "YOUR_CANVAS_PAGE_URL";

 $auth_url = "http://www.facebook.com/dialog/oauth?client_id=" 
        . $app_id . "&redirect_uri=" . urlencode($canvas_page);

 $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"]);
 }

?>

Проблема в том, что когда пользователь впервые авторизует мое приложение Canvas, Facebook не передает параметр signed_request при перенаправлении назад (как описано в примере кода), а параметр code.При доступе к приложению во второй раз (уже подтвердив права), он передает параметр signed_request, как и ожидалось.

Почему он передает параметр code в первый раз?Документация не объясняет, когда Facebook передает параметр code / signed_request.

Ответы [ 9 ]

2 голосов
/ 12 августа 2011

Я думаю, вам нужно добавить "& response_type = token" к вашему URL-адресу аутентификации:

https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&response_type=token

Тогда вы получите что-то похожее на:

http://apps.facebook.com/APP_NAME/#access_token=YOUR_APP_ID%YADA_YADA_YADA0&expires_in=3948

И вы можете извлечь его с помощью Javascript:

if (window.location.hash.length == 1)
{
       var accessToken = window.location.hash.substring(1);
}
2 голосов
/ 02 августа 2011

Проблема заключалась в том, что для $canvas_page я использовал URL-адрес холста (например, mysite.com/canvas) вместо URL-адреса страницы холста (например, apps.facebook.com/myapp).

1 голос
/ 25 января 2012

У меня была та же проблема с моим приложением canvas, я исправил ее, просто перенаправив на URL-адрес холста моего приложения в случае, если есть параметр запроса code GET.После этого Facebook отправляет мне POST-запрос, который, как и ожидалось, содержит параметр signature_request .Вот фрагмент кода Python Django:

if 'code' in request.GET.keys():
    return HttpResponseRedirect(FACEBOOK_CANVAS_URL)

# ...rest of your canvas handling code here
1 голос
/ 22 января 2012

Сай-и очень правильно.Я тоже боролся с этим много.При установке redirect_uri для моего доменного имени я получил бесконечный цикл перенаправления.При установке redirect_uri в URL-адрес приложения facebook я получил сообщение об ошибке, говорящее о том, что URL-адрес не находится в моем домене и поэтому недоступен.Потребовалось "/" в конце, чтобы решить это

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

Facebook использует параметр кода для аутентификации вашего приложения.В документации говорится:

* Если пользователь нажимает кнопку Разрешить, ваше приложение авторизуется.Диалог OAuth перенаправит (через HTTP 302) браузер пользователя на URL-адрес, который вы передали в параметре redirect_uri с кодом авторизации *

Чтобы завершить авторизацию, вы должны теперь взять параметр кода и ваше приложение в секрете ипередать его в конечную точку токена Graph API (перефразируя документацию).Это предоставит вам доступ к токену доступа.Начиная с этого момента, вашему приложению не потребуется параметр кода для этого пользователя, поскольку он уже аутентифицирован.

Facebook использует подписанный запрос для обмена информацией с вашим приложением.В документации изложены три сценария, в которых будет проходить подписанный запрос.Это:

  • Подписанный запрос передается в Apps на Facebook.com, когда они загружаются в среду Facebook
  • Подписанный запрос передается в любое приложение, которое зарегистрировало деавторизованный обратный вызов вприложение для разработчиков всякий раз, когда данный пользователь удаляет приложение с помощью панели инструментов приложения
  • Подписанный запрос передается приложениям, использующим плагин регистрации, каждый раз, когда пользователь успешно регистрируется в своем приложении

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

0 голосов
/ 03 октября 2012

У меня возникла проблема, которую вы описываете с Firefox и отключенными сторонними файлами cookie.

Я включил сторонние файлы cookie, а затем подписанный запрос был внезапно доступен.

0 голосов
/ 14 марта 2012

У меня была похожая проблема, которая была решена, когда я назначил пространство имен своему приложению, поэтому оно было бы похоже на apps.facebook.com/myapp, а не apps.facebook.com/1234.

0 голосов
/ 23 февраля 2012

Просто чтобы убрать путаницу с параметром кода. Facebook всегда отправляет этот параметр, когда пользователь разрешает приложение. Однако параметр signature_request отправляется с помощью post или каким-либо другим способом ... он не отправляется в URL-адресе. Вы можете получить к нему доступ, используя $ _REQUEST ['signature_request']

0 голосов
/ 03 ноября 2011

Я боролся с этой проблемой (не получая oauth ID в Sign_request и вместо этого получал «код» после того, как пользователь одобрил приложение) более недели, и этот пост (и несколько других постов) помог мне приблизиться к решениюпроблема (я использовал URL холста моих приложений вместо URL страницы холста в URI перенаправления, и я не указал пространство имен в настройках).

После внесения этих исправлений я столкнулся с другой проблемой, когда страница одобрения приложения не будет отображаться для нового пользователя, и вместо этого Facebook выдает сообщение «В приложении произошла ошибка и т. Д. И, наконец, я понял, чтоОтсутствует / в конце URL-адреса страницы холста в моем URL-адресе перенаправления. У меня он был https://apps.facebook.com/myappname вместо https://apps.facebook.com/myappname/ в URI перенаправления. Добавление / в конце решило проблему икогда новый пользователь получает доступ к моему приложению, используя https://apps.facebook.com/myappname (если пользователь уже вошел в систему), Facebook показывает страницу подтверждения (после получения ответа от моего сервера), и как только пользователь утверждает приложение, Facebook отправляет подписанное письмо.запрос с требуемым кодом авторизации для моего приложения. Надеюсь, это будет полезно для всех, кто может столкнуться с той же проблемой.

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