2011-12-10 15 views
2

Google Fusion Tablesを使用してデータを格納および取得する単純なデータベースを作成する作業を進めています。しかし、私は認証手続きに悩まされました。ここに私のコードは、これまでにどのように見えるかです:「非認証アクセスのみ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; 


    ?> 

が、これは、いくつかの洞察力を与える願っています! :)