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";
}
}
但是,它仍然給了我一個錯誤的請求錯誤,我認爲這是與鑰匙回來多行的事實做。有任何想法嗎?