2013-10-28 47 views

回答

0

下面的代碼將有助於獲得訪問令牌和通過的Oauth流量刷新網站管理員工具的API訪問令牌

確保您在API中提到重定向的URI控制檯應該與您將放置以下代碼的文件名相同。

對於如。如果重定向URI是:-somesitename.com/google_oauth.php(使用http://或https://),則應將以下腳本放置在: - google_oauth.php(路徑:somesitename.com/google_oauth.php(with http://或https://))

<?php 

    $OAuth = array(
     'oauth_uri' => 'https://accounts.google.com/o/oauth2/auth', 
     'client_id' => '#clientId', 
     'client_secret' => '#clientSecret', 
     'access_type' => 'offline', 
     'redirect_uri' => 'http://somesite.com/google_oauth.php', //this url should be same as you had registered in your api console as redirect uri() 
     'oauth_token_uri' => 'https://accounts.google.com/o/oauth2/token' 

    ); 
    $token = array(
     'access_token' => '', 
     'token_type' => '', 
     'expires_in' => '', 
     'refresh_token' => '' 
    ); 

    $title = 'No Code'; 
    $AuthCode = 'Null'; 

    // see if error parameter exisits 
    $error = _get_url_param($_SERVER['REQUEST_URI'], 'error'); 
    if ($error != NULL) 
    { // this means the user denied api access to GWMTs 
     $title = $error; 
    } 
    else 
    { // does the code parameter exist? 
     $AuthCode = _get_url_param($_SERVER['REQUEST_URI'], 'code'); 
     if ($AuthCode == NULL) 
     { // get authorization code 
      $OAuth_request = _formatOAuthReq($OAuth, "https://www.google.com/webmasters/tools/feeds/"); 

      header('Location: ' . $OAuth_request); 
      exit; // the redirect will come back to this page and $code will have a value 
     } 
     else 
     { 
      $title = 'Got Authorization Code'; 
      // now exchange Authorization code for access token and refresh token 
      $token_response = _get_auth_token($OAuth, $AuthCode); 
      $json_obj = json_decode($token_response); 
      $token['access_token'] = $json_obj->access_token; 
      $token['token_type'] = $json_obj->token_type; 
      $token['expires_in'] = $json_obj->expires_in; 
      $token['refresh_token'] = $json_obj->refresh_token; 
      echo 'access_token = ' . $json_obj->access_token; 
     } 
    } 

    function _get_auth_token($params, $code) 
    { 
     $url = $params['oauth_token_uri']; 

     $fields = array(
      'code' => $code, 
      'client_id' => $params['client_id'], 
      'client_secret' => $params['client_secret'], 
      'redirect_uri' => $params['redirect_uri'], 
      'grant_type' => 'authorization_code' 
     ); 
     $response = _do_post($url, $fields); 
     return $response; 
    } 

    function _do_post($url, $fields) 
    { 
     $fields_string = ''; 

     foreach ($fields as $key => $value) 
     { 
      $fields_string .= $key . '=' . $value . '&'; 
     } 
     $fields_string = rtrim($fields_string, '&'); 

     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_POST, count($fields)); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); 
     $response = curl_exec($ch); 
     curl_close($ch); 

     return $response; 
    } 

    function _formatOAuthReq($OAuthParams, $scope) 
    { 
     $uri = $OAuthParams['oauth_uri']; 
     $uri .= "?client_id=" . $OAuthParams['client_id']; 
     $uri .= "&redirect_uri=" . $OAuthParams['redirect_uri']; 
     $uri .= "&scope=" . $scope; 
     $uri .= "&response_type=code"; 
     $uri .= "&access_type=offline"; 


     return $uri; 
    } 

    function _get_url_param($url, $name) 
    { 
     parse_str(parse_url($url, PHP_URL_QUERY), $params); 
     return isset($params[$name]) ? $params[$name] : null; 
    } 

    function _get_refresh_token($params, $code) 
    { 
     $url = $params['oauth_token_uri']; 

     $fields = array(
      'code' => $code, 
      'client_id' => $params['client_id'], 
      'client_secret' => $params['client_secret'], 
      'refresh_token' => $token['refresh_token'], 
      'grant_type' => 'refresh_token' 
     ); 
     $response = _do_post($url, $fields); 
     return $response; 
    } 
    ?> 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
     <head> 
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
      <title><?= $title; ?></title> 
     </head> 
     <body> 
      <h1>OAuth2 Authorization Code</h1> 
      <p>Authorization Code: <?= $AuthCode; ?></p> 
      <p>access token: <?= $token['access_token']; ?></p> 
      <p>expires in: <?= $token['expires_in']; ?></p> 
      <p>refresh token: <?= $token['refresh_token']; ?></p> 
      <p></p> 

     </body> 
    </html> 

然後,您可以使用此令牌查詢網站管理員工具API的數據。在您的OAuth代碼https://www.google.com/webmasters/tools/feeds/在查詢網站管理員工具API數據所使用的分析https://www.googleapis.com/auth/analytics.readonly

您也可以使用您已經使用了您的OAuth分析訪問相同的代碼,只需更換這個網址。

+0

感謝您的回答sanju,我終於做出了正確的oauth,但無法找到網址發送請求q :) – user2927792