Недопустимая ошибка учетных данных при передаче токена доступа Oauth 2.0 в API Fusion Tables в PHP

Я дошел до точки отчаяния и прошу помощи. Я провел все выходные, изучая новые вещи, чтобы попытаться понять, как использовать API таблиц слияния Google, который требует аутентификации через Oauth 2.0. Я начал разрабатывать на php исключительно потому, что смог найти несколько примеров, которые помогли мне в дальнейшем. Несколько дней назад я очень мало знал в этой области, и если вам интересно, почему я попробовал определенный подход в моем коде ниже, а не какой-то другой подход, простой ответ заключается в том, что это все, что я нашел.

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

Теперь моя основная цель для всего этого — иметь возможность записывать стили таблиц слияния в новые таблицы слияния. В настоящее время у меня есть несколько полностью разработанных таблиц слияния (вместе с правильным стилем) в моей учетной записи документов Google. Я также загрузил тестовую таблицу слияния, в которой есть полностью разработанные данные, но еще не применены стили. Я пытался просто написать некоторый код, который получил бы стиль от существующего полностью разработанного FT и записал бы тот же стиль в этот тестовый FT.

Мне удалось успешно получить объект стиля JSON из существующего FT и изменить этот объект JSON таким образом, чтобы его свойство идентификатора таблицы было изменено на тестовый FT, чтобы объект JSON можно было передать обратно в тестовый FT и записать в стили. .

Однако, когда я пытаюсь передать данные стиля обратно в Google для обновления тестового FT через POST, я получаю сообщение об ошибке, которое выводится на " { "error": { "errors": [ { "domain": "global", "reason ": "authError", "message": "Неверные учетные данные", "locationType": "header", "location": "Авторизация" } ], "code": 401, "message": "Неверные учетные данные" } }"

Вполне возможно, что я неправильно форматирую POST. Однако я не делаю ничего необычного (пока) с токеном доступа. Я просто сделал запрос, получил его от Google, скопировал и вставил прямо в код, чтобы не было проблем с назначением переменных и/или тайм-аутом.

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

<html>
<head>
<title>Google Fusion Tables API Example</title>
</head>
<body>

<?php

  //table id of the FT that has fully developed styling.
  $strTableID = '1r8CRtGalQ3vC0zd_xmsChzjALlriiV5UDYFVOJU';

  //prepare your cURL request for GET of FT styling data from existing table.  Initialize it, set the options and then execute it.
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/fusiontables/v1/tables/'.$strTableID.'/styles/1?&key=redactedKey');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $result = curl_exec($ch);
  curl_close($ch);
  //print result to see if it works (it works)
  echo "<br> Result: $result";

  //the result returns as a JSON object.  Decode the object into a standard array, then display the individual elements of the array to see that it worked.
  $jsonResult = json_decode($result,true);
  echo "<br><br> JSON Result: ".$jsonResult['polygonOptions']['fillColorStyler']['columnName'];
  echo "<br> Table ID: ".$jsonResult['tableId'];

  //update the tableID and the bound column
  //this is the table id of the test FT
  $strTableID = '1CnecsDL67YHjBzSmfLjODRWxHDuC39frZEaTEKQ';
  $jsonResult['tableId'] = $strTableID;
  $jsonResult['polygonOptions']['fillColorStyler']['columnName'] = 'redacted column name';
  //print out the updated new JSON elements to see that they were properly applied (works)
  echo "<br><br> JSON Result: ".$jsonResult['polygonOptions']['fillColorStyler']['columnName'];
  echo "<br> Table ID: ".$jsonResult['tableId'];

  //Re-encode the array into a JSON object
  $jsonWrite = json_encode($jsonResult);


  $postField = 'access_token=redactedAccessToken in the form of ya29.AHE...Rdw';
  //set your header type so that Google knows what type of data it is receiving
  $arrHeader = array('Content-Type'=>'application/json');
  $url = "https://www.googleapis.com/fusiontables/v1/tables/".$strTableID."/styles";

  //prepare your cURL request.  Initialize it, set the options and then execute it.
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $arrHeader);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $postField.'&'.$jsonWrite);
  $result = curl_exec($ch);
  curl_close($ch);
  //print out the response to see if it worked (doesn't work)
  echo "<br><br>Post Result: $result";

?>
</body>
</html>

Я также попробовал один альтернативный метод. Я попытался поместить токен доступа в заголовок POST как таковой:

$arrHeader = array('Content-Type'=>'application/json', 'access_token'=>'redactedAccessToken in the form of ya29.AHE...Rdw');

А затем упрощая параметры полей публикации как таковые:

curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonWrite);

Это возвращает другую ошибку: "{ "error": { "errors": [ { "domain": "global", "reason": "required", "message": "Required Login", "locationType": "header ", "местоположение": "Авторизация" } ], "код": 401, "сообщение": "Требуется вход в систему" } }"

Пожалуйста, окажите любую помощь, если можете. Спасибо за уделенное время.


person Scott Kennedy    schedule 06.03.2012    source источник


Ответы (1)


Маркер доступа должен быть отправлен в виде HTTP-заголовка Authorization: Bearer ИЛИ в виде значения параметра access_token в URL-адресе.

Чтобы отправить заголовок Authorization: Bearer, снова используйте переменную $arrHeader, но обновите строку кода до следующей:

$arrHeader = array('Content-Type'=>'application/json', 'Authorization'=>'Bearer <your_access_token>');

Или, если вы хотите использовать параметр access_token, обновите следующую строку и не отправляйте токен доступа в теле сообщения:

  curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/fusiontables/v1/tables/'.$strTableID.'/styles/1?&key=redactedKey&access_token=<your_access_token>');
person Kathryn Hurley    schedule 06.03.2012
comment
Спасибо, Кэтрин. Вы всегда так щедро делитесь своим временем и своим опытом, и это действительно ценится. - person Scott Kennedy; 08.03.2012
comment
Я успешно воспользовался вторым предложением Кэтрин. Однако мне пришлось внести одно дополнительное изменение, чтобы заставить его работать, мне пришлось изменить: значение массива заголовков из пары значений в одну строку. (Я убрал '=›' и просто сделал заголовок одной строкой с двоеточием посередине). Спасибо еще раз. - person Scott Kennedy; 08.03.2012