2012-01-17 38 views
2

I found this function據推測,它會獲取accessToken,但我什麼也沒得到。 我確實有$_REQUEST['code']以及此功能所需的其他信息。PHP。如何獲取訪問令牌。使用Google API的OAuth 2.0進行身份驗證

任何想法這裏有什麼錯? 謝謝。

//Oauth 2.0: exchange token for session token so multiple calls can be made to api 
if(isset($_REQUEST['code'])){ 
    $_SESSION['accessToken'] = get_oauth2_token($_REQUEST['code']); 
} 

//returns session token for calls to API using oauth 2.0 
function get_oauth2_token($code) { 
    global $client_id; 
    global $client_secret; 
    global $redirect_uri; 

    $oauth2token_url = "https://accounts.google.com/o/oauth2/token"; 
    $clienttoken_post = array(
    "code" => $code, 
    "client_id" => $client_id, 
    "client_secret" => $client_secret, 
    "redirect_uri" => $redirect_uri, 
    "grant_type" => "authorization_code" 
    ); 

    $curl = curl_init($oauth2token_url); 

    curl_setopt($curl, CURLOPT_POST, true); 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $clienttoken_post); 
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

    $json_response = curl_exec($curl); 
    curl_close($curl); 

    $authObj = json_decode($json_response); 

    if (isset($authObj->refresh_token)){ 
     //refresh token only granted on first authorization for offline access 
     //save to db for future use (db saving not included in example) 
     global $refreshToken; 
     $refreshToken = $authObj->refresh_token; 
    } 

    $accessToken = $authObj->access_token; 
    return $accessToken; 
} 

回答

1

我沒有看到你的代碼有什麼問題,但你可能想嘗試刷新客戶端的祕密,看看是否有幫助。此外,我建議你確切地看到curl命令返回的響應,我懷疑它是「invalid_grant」。

一個更好的方法來做到這一點是使用谷歌的PHP API客戶端:

https://code.google.com/p/google-api-php-client/

,可處理大部分通信的爲您服務。這裏的例子非常易於使用。它主要取決於您嘗試訪問哪個Google服務。

1

該代碼看起來很熟悉 - 我使用的代碼大致相同 - 有兩件事你可以嘗試。

  1. 使用echo回顯到瀏覽器

    回聲$ json_response響應;提琴手

  2. 弄個並使用下面的線路的呼叫前curl_exec

    curl_setopt($捲曲,CURLOPT_PROXY, '127.0.0.1:8888');

「冒牌貨我還沒有得到它的工作要麼 - 我得到的迴應是

{ 
    "error" : "invalid_request" 
} 

現在如果有誰知道怎麼樣是不對的;)

0

從4.4節.2「OAuth 2.0授權協議draft-ietf-oauth-v2-20」

客戶端向令牌端點發出請求,方法是添加 個使用「應用程序/ x WWW的形式進行了urlencoded」以下參數 格式在HTTP請求實體主體:

所以所張貼的參數應在一個字符串,而不是一個陣列的形式被提交。這也在curl_setopt的PHP手冊中提到過。

因此,不要發佈$ clienttoken_post,您可能需要發佈http_build_query($ clienttoken_post,'','&')。

這可能無法解決您的所有問題,但這可能是邁向正確方向的一步。

0

我有同樣的錯誤,我發現,添加

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 

允許請求遵循重定向迅速解決它。我希望能幫助別人!

4

這就是我做我的訪問令牌和刷新令牌。

創建一個包含下面的代碼文件:

<?php 

if (isset($_GET['code'])) { 
    // try to get an access token 
    $code = $_GET['code']; 
    $url = 'https://accounts.google.com/o/oauth2/token'; 
    $params = array(
     "code" => $code, 
     "client_id" => YOUR_CLIENT_ID, 
     "client_secret" => YOUR_CLIENT_SECRET, 
     "redirect_uri" => 'http://' . $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"], 
     "grant_type" => "authorization_code" 
    ); 

    $ch = curl_init(); 
    curl_setopt($ch, constant("CURLOPT_" . 'URL'), $url); 
    curl_setopt($ch, constant("CURLOPT_" . 'POST'), true); 
    curl_setopt($ch, constant("CURLOPT_" . 'POSTFIELDS'), $params); 
    $output = curl_exec($ch); 
    $info = curl_getinfo($ch); 
    curl_close($ch); 
    if ($info['http_code'] === 200) { 
     header('Content-Type: ' . $info['content_type']); 
     return $output; 
    } else { 
     return 'An error happened'; 
    } 
} else { 

    $url = "https://accounts.google.com/o/oauth2/auth"; 

    $params = array(
     "response_type" => "code", 
     "client_id" => YOUR_CLIENT_ID, 
     "redirect_uri" => 'http://' . $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"], 
     "scope" => "https://www.googleapis.com/auth/plus.me" 
    ); 

    $request_to = $url . '?' . http_build_query($params); 

    header("Location: " . $request_to); 
} 

現在,您的客戶端ID和客戶端密鑰替換YOUR_CLIENT_IDYOUR_CLIENT_SECRET

確保您的範圍是正確的。例如,如果您想訪問Google Analytics,那麼它應該是https://www.googleapis.com/auth/analytics

如果您運行該文件,則應該獲得OAuth2批准屏幕。

如果你現在按Accept,你應該得到的結果看起來像這樣:

{ 
    "access_token" : YOUR_ACCESS_TOKEN, 
    "token_type" : "Bearer", 
    "expires_in" : 3600, 
    "refresh_token" : YOUR_REFRESH_TOKEN 
} 

結果可能包含附加字段,這取決於你申請的是哪個範圍。

+1

Thanx alot bro ....你的代碼對我來說是完美的 – deemi 2016-10-13 11:49:58

+0

你是如何運行該文件的?我把它放到filezilla的一個php文件中,並用瀏覽器執行。但它不適用於我 – Simone 2017-08-13 11:45:03

+0

@Simone:你有任何錯誤? – 2017-08-13 15:40:33

相關問題