Вопрос по facebook-graph-api – Неверно сформированный токен доступа к Facebook

21

Я пытаюсь использовать API Graph Facebook для получения фотоальбомов с Facebook и размещения их на веб-сайте, над которым я работаю. Я использую PHP в качестве своего языка с платформой Codeigniter и перенаправляю на URL-адрес Facebook, чтобы получить маркер доступа для пользователя. Facebook возвращает мне токен доступа, и я беру его и вставляю в свою базу данных.

При этом, когда я пытаюсь получить данные JSON для фотоальбома, перейдя по URL-адресу графика, он возвращает ошибку. URL-адрес графика и ошибка:

https://graph.facebook.com/1298926000574/photos?access_token=[MY ACCESS TOKEN]

My access token: AQBxqdB64GHNTGY5Yp_IOuMY7NerwNtXVVrp2HwT1qXj02zqU-63KJDyB2jzqurlJ4M0vd7TAu7upA6T7ZYQzIChr2PgD1dpu-6Iebi0WVILbBSBOu-yj7sgcHSGS-Ew4Yio0I9In-1O5jOxbYLDMbI0Zmwk-F1-u-7a8iVvTJram8PvpmdRt5eg

Returned error:

{
"error": {
  "message": "Malformed access token [MY ACCESS TOKEN]",
  "type": "OAuthException",
  "code": 190
}
} 

Я действительно не уверен, почему Facebook продолжает возвращать мне эту ошибку. Маркер доступа довольно длинный, и я храню его в своей базе данных в виде «текста». поле. Я следовал их инструкциям, и теперь они стреляют мне в ногу. Любая помощь приветствуется.

Помещены ли вами в квадратные скобки слова? Jasper Mogg
Do not post real access tokens publicly! Убедитесь, что вы изменили некоторые символы во всех ваших токенах доступа и постарайтесь сделать их недействительными, выйдя из системы и войдя снова, как только вы закончите с этим вопросом! Emil Vikström
Вы пытались обойти хранение в базе данных и вместо этого использовать его непосредственно из возвращенных данных из Facebook? Я хочу убедиться, что хранение и запросы обратно из токена не виноваты. Nick
Да, это просто, чтобы показать, где маркер доступа находится в URL и ошибка JSON user1470807
Определенно, что-то не так с этим токеном доступа - ни один из моих, кажется, не имеет подчеркивания или тире в них ... он каким-то образом закодирован? Jasper Mogg

Ваш Ответ

6   ответов
0

code вместоaccess_token в вашем запросе.

Решение дляLaravel Socialite пользователей:

Использование:

$response = Socialite::driver($provider)->getAccessTokenResponse($request['code']);
$user = Socialite::driver($provider)->userFromToken($response['access_token']);

Вместо:

$user = Socialite::driver($provider)->user();
2

как это работает и здесь для тех, кто тонет в той же грязи.

require 'facebook-php-sdk/facebook.php';
$facebook = new Facebook(array(
  'appId'  => 'APP ID',
  'secret' => 'SECRET KEY',
));

// Get User ID
$user = $facebook->getUser();  
if ($user) {
    $accessToken = $facebook->getAccessToken();
        try {
            $url = "https://graph.facebook.com/1298926000574/photos?access_token=".$accessToken;

            $photos = $facebook->api($url);
            var_dump($photos);
        } catch (FacebookApiException $e) {
            $user = null;
        }
    }   
} else {
    //echo "You need to login";
    header("Location:".$facebook->getLoginUrl());
}
-1

это неправильно сформированное исключение означает ошибку при форматированииrequest.

https://graph.facebook.com/me/photos/?access_token=[your_accesstoken]

Так было бы как

https://graph.facebook.com/me/photos/?access_token=AQBxqdB64GHNTGY5Yp_IOuMY7NerwNtXVVrp2HwT1qXj02zqU-63KJDyB2jzqurlJ4M0vd7TAu7upA6T7ZYQzIChr2PgD1dpu-6Iebi0WVILbBSBOu-yj7sgcHSGS-Ew4Yio0I9In-1O5jOxbYLDMbI0Zmwk-F1-u-7a8iVvTJram8PvpmdRt5eg
В чем разница двух URL?
62

и я нашел этот пост в поисках решения. Я заметил, что «наши» Маркер доступа содержит множество нечетных символов, а остальные представляют собой буквенно-цифровую строку.

Я считаю, что ошибка, которую вы (и я) совершил, заключалась вcode сaccess_token

После отправки пользователя Facebook на ваш API для подтверждения доступа, они возвращаются на ваш сайт с$_GET['code'], Этот код должен быть подтвержден с Facebook, который вернетaccess_token на успех.

$app_id = [YOUR_APP_ID];
$app_secret = [YOUR_APP_SECRET];
$my_url = [THE_SAME_AS_THE_POST_BEFORE];
$code = $_GET['code'];

$token_url = "https://graph.facebook.com/oauth/access_token?"
. "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
. "&client_secret=" . $app_secret . "&code=" . $code;

$response = file_get_contents($token_url);
$params = null;
json_decode($response, $params);
$access_token = $params['access_token'];

Подробнее о получении access_token с PHP

Подробнее об использовании правильного redirect_uri

он должен быть помечен как принятый ответ
+1 за отличное объяснение! Тем не мение,parse_str не работает. Я думаю, это потому, что API, возможно, немного изменился. Вместо,json_decode делает работу
1
tl;dr

шего токена доступа с каналом (|) символ между ними:123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ.

Creating and using an access token

Note: In this tutorial I use only dummy credentials. They will be in the same style as real ones would be but their exact value is just a series of incremented numbers or characters. Never post your actual credentials online!

Creating an access token

Требования:

App id: 123456789012345 App secret: ZYxwVUTSRqpONMLKjiHGfeDCbA

Если вы будете следоватьруководство по созданию токена доступа Вы найдете этот URL, где вы можете создать его:

GET /oauth/access_token?client_id={app-id}&client_secret={app-secret}&grant_type=client_credentials

Если мы вставим в наши фиктивные учетные данные URI запроса GET, он должен выглядеть следующим образом:

 http://graph.facebook.com/oauth/access_token?client_id=123456789012345&client_secret=ZYxwVUTSRqpONMLKjiHGfeDCbA&grant_type=client_credentials

Ответ будет:

{
  "access_token": "123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ",
  "token_type": "bearer"
}

Маркер доступа состоит из идентификатора вашего приложения, за которым следует канал (|) затем строка, которую можно назвать фактическим токеном доступа.

Using the access token

Требования:

Access token: 123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ Whatever other credential you need. User id in this example: 1234567890

В этом примере я буду следоватьофициальное руководство по отправке уведомлений в Facebook, Они показали этот шаблон:

POST /{recipient_userid}/notifications?access_token=... &template=...&href=...

Это означает, что после ввода учетных данных пример запроса POST должен выглядеть следующим образом:

http://graph.facebook.com/1234567890/notifications?access_token=123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ&template=Test&ref=notif_test
3

и это было решением, это может быть связано с вашей проблемой:

Php запрашивает access_token, и серверы Facebook возвращают его.

Возвращенное сообщение, содержащее access_token USED, должно быть похоже на:

access_token=.......

Но для вновь созданных приложений (2012) серверы facebook возвращают:

access_token=.....&expires=.....

Если ваш код анализирует это неправильно, как в

$access_token=str_replace('access_token=','',$message);

тогда ваш $ access_token ошибочно содержит дополнительные & expires и т. д.

это должно быть проанализировано как:

parse_str($message,$ar); $access_token=$ar['access_token'];

Похожие вопросы