2011-12-10 1 views
2

Google 퓨전 테이블을 사용하여 데이터를 저장하고 검색하는 간단한 데이터베이스를 작성하고 있습니다. 그러나 나는 인증 과정에 걸림돌을 쳤다. 여기 내 코드는 지금까지 보이는 방법은 다음과 같습니다. "인증되지 않은 액세스는 SELECT andDESCRIBE 문에 허용"Google ClientLogin 인증

이 코드를 테스트 할 때, 내가 말하는 401 오류가 계속
<?php 
// Establish login data for Google account hosting Fusion Table. 
$login_data = array(
    'accountType' => 'GOOGLE', 
    'Email' => '[email protected]', 
    'Passwd' => 'xxxxxxxxxxx', 
    'service' => 'fusiontables', 
    'source' => 'jordanMeyer-musicNotes-1' 
    ); 

$login_query = http_build_query($login_data); 

// Establish the POST request and send it to Google's server. 
$google = curl_init('https://www.google.com/accounts/ClientLogin'); 
curl_setopt($google, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($google, CURLOPT_POST, TRUE); 
curl_setopt($google, CURLOPT_POSTFIELDS, $login_query); 
$results = curl_exec($google); 
$results = explode("\n", $results); 
$token = $results[2]; 
$token = substr($token, 5); 
$auth_header = array(
    'Authorization' => 'GoogleLogin auth=' . $token 
); 
curl_close($google); 

$insert_data = array(
    'sql' => 'INSERT INTO 2317404 (Artist) VALUES (\'Test\')', 
); 

$insert_query = http_build_query($insert_data); 

$insert = curl_init('https://www.google.com/fusiontables/api/query'); 
curl_setopt($insert, CURLOPT_POST, TRUE); 
curl_setopt($insert, CURLOPT_HTTPHEADER, $auth_header); 
curl_setopt($insert, CURLOPT_POSTFIELDS, $insert_query); 
curl_exec($insert); 
?> 

POST 작업에서 권한 부여 헤더도 서버를 Fusion Tables 서비스에 전달할 때 이것이 왜 발생하는지 확신 할 수 없습니다. 내가 뭘 잘못하고 있는지에 대한 어떤 생각?

답변

2

더 자세히 살펴보면 내 실수가 코딩 실수라는 것을 알았습니다. 다른 루키 웹 개발자가 이런 종류의 문제를 겪고있는 경우에 대비하여 여기에 답변 해 드리겠습니다 ...

POST를 Fusion Tables 서버로 보낼 때, to-be HTTP 헤더 값이 저장되었습니다. 나는 이런 식으로했습니다 :

$auth_header = array(
    'Authorization' => 'GoogleLogin auth=' . $token 
); 

"Authorization : GoogleLogin auth = ..."헤더를 출력하려고합니다. 그러나, 나는 cURL에서 HTTP 헤더를 만드는 것에 대한 나의 이해에서 오해되었다. 배열에는 값 배열이 필요하지만 배열에는 인덱스 변수가 필요하지 않습니다. 말했다되는 것이 적절한 방법은 다음과 같이 될 것이다 코드에이 쓰기 :

$auth_header = array(
    'GoogleLogin auth=' . $token 
); 

그것은 밝혀 내 자신을 위해 일을과 복잡함을했다. 신참 같은 질문에 대해 유감스럽게 생각합니다. 바라건대이 대답은 내 상황에서 다른 사람에게 유용 할 것입니다!

2

나는이 문제가 있다고 덧붙이고, Google 계정에서 2 단계 인증을 사용하도록 설정했기 때문에 발생합니다. 애플리케이션 비밀번호를 만들어야했습니다.

2

이 질문에 대답하면 나도 몰라,하지만 여기에 내가 일하고있어 일부 코드의 ...

<?php 

    //get clientLogin 'Auth' code 
    $ch_cl = curl_init(); 

    curl_setopt($ch_cl, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin"); 
    curl_setopt($ch_cl, CURLOPT_FOLLOWLOCATION, true); 

    $data_cl = array('accountType' => 'GOOGLE', 
     'Email' => '[email protected]', 
     'Passwd' => 'PW', 
     'source'=>'Name-app-version', 
     'service'=>'fusiontables' 
    ); 

    curl_setopt($ch_cl, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch_cl, CURLOPT_POST, true); 
    curl_setopt($ch_cl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch_cl, CURLOPT_POSTFIELDS, $data_cl); 

    $cLresponse = curl_exec($ch_cl); 
    curl_close($ch_cl); 
    //parse the $cLresponse and pick out the clientLogin 'Auth' token 
    $cLrespArrys = explode("\n", $cLresponse); 
    $authStr = explode("=", $cLrespArrys[2]); 

    echo "return is:<br>" . $authStr[0] . "=" . $authStr[1]; 

    $auth = $authStr[1]; 

    echo "<br><br>" . $auth; 

    //post data to fusionTables once clientLogin Auth token is retieved 
    $ch_ft = curl_init(); 
    fopen("response.csv"); 
    curl_setopt($ch_ft, CURLOPT_URL, "https://www.google.com/fusiontables/api/query"); 
    curl_setopt($ch_ft, CURLOPT_FOLLOWLOCATION, 1); 

    $header[] = 'Authorization: GoogleLogin auth=' . $auth; 

    $data_ft = array( 
     'sql' => "INSERT INTO " .$tableID . " (users, history, media) VALUES ('user1' ,'historyID' ,'mediaID')", 
    ); 

    $postData_ft = http_build_query($data_ft); 

    echo "<br><br>" . $postData_ft; 

    curl_setopt($ch_ft, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch_ft, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch_ft, CURLOPT_HEADER, 1); 
    curl_setopt($ch_ft, CURLOPT_POST, 1); 
    curl_setopt($ch_ft, CURLOPT_HTTPHEADER, $header); 
    curl_setopt($ch_ft, CURLOPT_POSTFIELDS, $postData_ft); 

    $fTresponse = curl_exec($ch_ft); 
    curl_close($ch_ft); 

    echo $fTresponse; 


    ?> 

희망이 몇 가지 통찰력을 제공합니다! :)