Ошибка с Oauth в Facebook JS SDK

Я сталкиваюсь со странной проблемой при попытке выполнить расширенный процесс входа в систему с использованием API Facebook с долгоживущими токенами, хранящимися на моем сервере (https://developers.facebook.com/docs/facebook-login/access-tokens#long-via-code)

Проблема заключается в следующем: после отправки сгенерированного кода обратно моему клиенту (в данном случае веб-приложению JS) я должен вызывать API-интерфейс графа для создания долгоживущего токена. Мой звонок выглядит примерно так:

var requestUri = "/oauth/access_token?code=" + code + "&client_id=" + facebookAppId + "&redirect_uri=" + redirectUrl;
FB.api(requestUri, function(response) {
    console.log(response);
});

Однако при обратном вызове этого запроса FB.api я получаю ответ, который выглядит следующим образом:

{
    "error": {
        "message": "unknown error",
        "type": "http"
    }
}

В консоли также есть ошибка JS:

Uncaught SyntaxError: Unexpected token :

Что действительно странно во всем этом, так это то, что если я посмотрю на необработанный ответ на вызов /oauth/access_token, я увижу ожидаемый ответ с кодом успеха 200.

{
    "access_token": "...",
    "machine_id": "...",
    "expires_in": 5184000
}

Из этого я могу определить, что ответ JSON неправильно читается моим браузером (в данном случае Chrome). На самом деле, если я вставлю необработанный ответ выше в консоль Chrome Dev JS, он выдаст ту же ошибку JS. Однако, если бы я присвоил его переменной в консоли, проблем не возникло бы. В основном кажется, что что-то идет не так в JS SDK Facebook, и объект ответа никогда не возвращается должным образом в функцию обратного вызова. Кто-нибудь сталкивался с чем-то подобным раньше? Кажется, я не могу найти ответ на этот вопрос.


person Kyle Bernstein    schedule 05.08.2015    source источник


Ответы (1)


На данный момент я нашел обходной путь для этого. Я почти уверен, что проблема возникает где-то в Facebook JS SDK. Чтобы обойти это, я сделал необработанный вызов API графа, используя AJAX, в данном случае используя AngularJS.

$http.get("https://graph.facebook.com/oauth/access_token....)

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

Я также могу отказаться от использования FB.api, потому что я запрашиваю токен доступа, и мне не нужно беспокоиться о том, что JS SDK управляет им за меня.

Если у кого-то есть другие решения исходной проблемы, я был бы рад их услышать. Я по-прежнему хотел бы использовать Facebook SDK везде, где это возможно.

person Kyle Bernstein    schedule 05.08.2015