我正在尝试构建一个基本的应用程序,我可以使用Google的RESTful api修改自己的Google日历,但是我无法获得oAuth令牌。我选择使用服务应用程序oAuth流程来做 - 我不想不断地再次同意让我自己的应用程序使用我的日历,但如果有更好的方法来做到这一点,请告诉我。 / p>
每次我发出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);
}
?>
非常感谢任何帮助
更新
所以我再次完成了服务流程并意识到我需要使用私钥,我现在正在做。我的主要问题是是否包含我从谷歌下载的“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 :(得分:0)
对于遇到此问题的任何人,我基本上得出的结论是谷歌还没有将日历与他们的服务帐户接口,并且使用刷新令牌来获得类似的结果,而无需一直登录。