2013-07-12 262 views
1

我試圖建立一個基本的應用程序,我可以使用谷歌的RESTful的API修改我自己的谷歌日曆,但我遇到了麻煩OAuth令牌。我選擇使用服務應用程序的OAuth流程做 - 我不希望有不斷地重新同意讓自己的應用程序使用我的日曆,但如果有更好的方法來做到這一點,請讓我知道。谷歌服務的OAuth請求,則返回HTTP 400錯誤的請求錯誤

我每次做的http請求我得到一個錯誤的請求錯誤。任何想法/幫助?

下面的代碼:

  <?php 

      $payload = array(
        "iss"=>"services client email", 
        "scope"=>"https://www.googleapis.com/auth/calendar", 
        "aud"=>"https://accounts.google.com/o/oauth2/token", 
        "iat"=>date("U"), 
        "exp"=>date("U")+3600 
       ); 

      $key = "Simple API key"; 
      $jwt = encode_header($payload,$key); 

      print_r(request_g_token($jwt)); 


      function request_g_token($jwt) 
      { 
       $data = array(
        'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', 
        'assertion' => $jwt 
       ); 

       $data = http_build_query($data); 
       $url = "https://accounts.google.com/o/oauth2/token"; 
       //echo $data; 
       $opts = array('http' => 
        array(
         'protocol_version' => '1.1',  
         'method' => 'POST', 
         'header' => "Host: accounts.google.com\r\n" . 
            "Content-Type: application/x-www-form-urlencoded\r\n", 
         'content' => $data 
        ) 
       ); 

       $context = stream_context_create($opts); 

       return (file_get_contents($url, false, $context)); 
      } 

      function urlsafeb64encode($input){ 
       return str_replace('=','',strtr(base64_encode($input),'+/','-_')); 
      } 

      function encode_header($payload, $key, $algo = 'RS256'){ 
       $header = array('typ' => 'JWT', 'alg' => $algo); 

       $segments = array(); 
       $segments[] = urlsafeb64encode(json_encode($header)); 
       $segments[] = urlsafeb64encode(json_encode($payload)); 
       $signing_input = implode('.',$segments); 

       $sig = sign_encode($signing_input,$key); 
       $segments[]=urlsafeb64encode($sig); 

       return implode('.',$segments); 
      } 

      function sign_encode($msg, $key){ 
        return hash_hmac('sha256', $msg, $key, true); 
      } 
      ?> 

任何幫助,將不勝感激

UPDATE

所以我通過服務流程去一次意識到我需要使用私鑰,我現在正在做的。我的主要問題是,是否包含我從谷歌下載的「private-key.p12」部分。我仍然收到錯誤請求錯誤很遺憾......

更新2

意識到我需要從拔出鑰匙的pk12中的文件,我使用此代碼這樣做:

function getKey($file){ 
     $p12cert = array(); 

     $fd = fopen($file, 'r'); 
     $p12buf = fread($fd,filesize($file)); 
     fclose($fd); 

     if (openssl_pkcs12_read($p12buf, $p12cert, 'notasecret')) 
     { 
      //worked 
      $temp = $p12cert['pkey']; 
      $temp = str_replace("-----BEGIN PRIVATE KEY-----","",$temp); 
      $temp = str_replace("-----END PRIVATE KEY-----","",$temp); 
      return $temp; 
     } 
     else 
     { 
      //failed 
      return "failed"; 
     } 
    } 

但是,它仍然給了我一個錯誤的請求錯誤,我認爲這是與鑰匙回來多行的事實做。有任何想法嗎?

回答

0

對於任何人遇到這個問題,我已經基本上來,谷歌已經沒有接口與他們的服務帳戶日曆着呢,我使用的是刷新令牌來達到類似的效果,而無需登錄所有的時間結束。

相關問題