2014-06-05 69 views
1

我正在嘗試使用Google Api日曆,但我無法通過身份驗證步驟。PHP - 使用OAuth 2.0服務器到服務器應用程序 - 無效的授權

繼這個tutorial後,我寫了一些php代碼(是的,我知道,我應該使用API​​),它給了我「無效授權」作爲響應。

我很死硬,我真的會知道我的錯誤在哪裏。我想是符號步驟,但private_key是一個有效的結構。我用這個命令轉換P12獲得的。質子交換膜:

OpenSSL的PKCS12 -in key.p12退房手續key.pem -nodes

你能幫幫我嗎?

謝謝。

<?php 
$private_key = openssl_pkey_get_private('file://key.pem', 'notasecret'); 

$header = array("alg" => "RS256", "typ" => "JWT"); 
$header = base64_encode(utf8_encode(json_encode($header))); 
$exp = time() + (60 * 60); 

$jwt_cs = array(
    "iss" => "************************@developer.gserviceaccount.com", 
    "scope" => "https://www.googleapis.com/auth/calendar.readonly", 
    "aud" => "https://accounts.google.com/o/oauth2/token", 
    "exp" => $exp, 
    "iat" => time(), 
    "access_type" => "offline" 
); 
$jwt_cs = base64_encode(utf8_encode(json_encode($jwt_cs))); 
openssl_sign($header.$jwt_cs, $sign, $private_key, 'sha256WithRSAEncryption'); 

$sign = base64_encode($sign); 

$jwt = $header.$jwt_cs.$sign; 

$login_data = array(
    'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', 
    'assertion' => $jwt 
); 
$url='https://accounts.google.com/o/oauth2/token'; 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($login_data)); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$res = json_decode(curl_exec($ch)); 
curl_close($ch); 
var_dump($res) 
?> 
+0

我不確定'access_type'到jwt數組中。我試圖在沒有它的情況下啓動這個腳本,錯誤是一樣的。 – Tore

回答

0

當計算簽名時,需要以連接頭和權利要求組中以點「」,即$header . '.' . $jwt_cs。 構建JWT時,還需要將標題,聲明集和簽名連接成點「。」,即$header . '.' . $jwt_cs . '.' . $sign

+0

哎唷!我已經將conc char與concat運算符混淆了。謝謝! – Tore

相關問題