Google服务OAuth请求返回HTTP 400错误请求错误

时间:2013-07-12 17:02:56

标签: php google-api oauth-2.0 file-get-contents

我正在尝试构建一个基本的应用程序,我可以使用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";
        }   
    }

然而,它仍然给我一个错误的请求错误,我认为这与密钥以多行返回的事实有关。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

对于遇到此问题的任何人,我基本上得出的结论是谷歌还没有将日历与他们的服务帐户接口,并且使用刷新令牌来获得类似的结果,而无需一直登录。