使用ClientLogin和PHP/cURL登录Google Spreadshet API

5

我正在使用ClientLogin方法和cURL登录到Google API。这很好用,我收到了一个用于进一步使用的令牌。现在,我可以通过使用此令牌来查询docs.google.com。

        $curl = curl_init();

        $headers = array(
            "Authorization: GoogleLogin auth=" . $auth,
            "GData-Version: 3.0",
        );

        curl_setopt($curl, CURLOPT_URL, "https://docs.google.com/feeds/default/private/full");
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_POST, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

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

这个代码可以很好地运行,我可以得到我在Google文档中所有可用文档的列表。但是如果我使用从API文档获取的URL尝试在spreadsheets.google.com上执行相同的查询:

https://spreadsheets.google.com/feeds/spreadsheets/private/full

我收到了一个401错误,表示使用的令牌无效。我在两种情况下都使用相同的令牌和查询。我需要为谷歌表格API使用不同的令牌吗?

编辑: 这是我请求令牌的方式:

        $clientlogin_url = "https://www.google.com/accounts/ClientLogin";
        $clientlogin_post = array(
            "accountType" => "HOSTED_OR_GOOGLE",
            "Email" => "my email",
            "Passwd" => "my password",
            "service" => "writely",
            "source" => "my application name"
        );

        $curl = curl_init($clientlogin_url);

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

        $response = curl_exec($curl);

        preg_match("/Auth=([a-z0-9_-]+)/i", $response, $matches);
        $auth = $matches[1];
        curl_close($curl);

相同的令牌应该没问题,但请注释掉 $curl = curl_init(); 并在 spreadsheets.google.com 中使用相同的 $curl 对象。如果有帮助,请告诉我。 - Eswar Rajesh Pinapala
很遗憾,这没有任何影响。 - Marco
啊,我认为您需要对所有域进行身份验证。我认为谷歌将docs.google.com和spreadsheets.google.com视为两个不同的服务,需要它们自己的身份验证。您可以通过以下方式快速测试-> 1.获取谷歌文档列表,保存身份验证2.使用相同的身份验证表格,捕获失败,并3.再次使用相同的身份验证文档,如果这样可以工作,则我们的假设是正确的。 - Eswar Rajesh Pinapala
我不确定这是否是您的意思,但我查询了Google文档,查询了电子表格,然后再次查询了文档。每次查询后我都关闭了curl连接。查询1和3正常工作,查询2仍然有相同的错误。 - Marco
我添加了请求令牌的方式。只是用同样的方式请求第二个令牌并将其用于电子表格API是不起作用的。 - Marco
显示剩余2条评论
1个回答

6
简短回答:是的。您需要为不同的服务生成不同的令牌。在检索授权令牌时,传递的服务名称在每种情况下都不同。有关更多详细信息,请参见此处:https://developers.google.com/gdata/faq 例如,在文档中,电子表格的请求将是:
$clientlogin_post = array(
            "accountType" => "HOSTED_OR_GOOGLE",
            "Email" => "my email",
            "Passwd" => "my password",
            "service" => "wise",
            "source" => "my application name"
        );

谢谢,那个常见问题链接真是个宝藏 :) - aorcsik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接