2012-03-06 2 views
3

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

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

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

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

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

Возможно, что я неправильно форматировал 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 ":" Login Required "," locationType ":" header "," location ":" Authorization " }], «code»: 401, «message»: «Login Required»}} «

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

ответ

4

Маркер доступа должен либо отправляться в качестве заголовка авторизации: несущий HTTP, либо как значение параметра 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>'); 
+0

Спасибо, Кэтрин. Вы всегда так щедры с своим временем и своим опытом, и это очень ценится. –

+0

Я использовал второе предложение Кэтрин успешно. Мне пришлось сделать еще одно изменение, чтобы заставить его работать, но мне пришлось изменить: значение моего массива заголовков из пары значений в одну строку. (Я вынул «=>» и просто сделал заголовок одной строкой с двоеточием в середине). Еще раз спасибо. –

Смежные вопросы