Ошибка неверных учетных данных при передаче Oauth 2.0 Access Token в API Fusion Tables в PHP - PullRequest
3 голосов
/ 06 марта 2012

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

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

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

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

Однако, когда я пытаюсь передать обратноСтилирование данных в Google для обновления тестового FT через POST Я получаю ошибку, которая выводит сообщение "{" error ": {" errors ": [{" domain ":" global "," reason ":" authError "," message "":" Неверные учетные данные "," locationType ":" header "," location ":" Authorization "}]," 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');

, а затем упростить параметры поля «Post» следующим образом:

curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonWrite);

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

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

1 Ответ

4 голосов
/ 06 марта 2012

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

Чтобы отправить в качестве заголовка Авторизация: Носитель, снова используйте переменную $ 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>');
...