将Oauth 2.0访问令牌传递给PHP中的Fusion Tables API时出现无效的凭据错误

时间:2012-03-06 01:40:23

标签: php oauth-2.0 google-fusion-tables

我已经达到了沮丧的程度,并且正在寻求帮助。我花了整个周末学习新东西,试图找出如何使用goolge融合表API,这需要通过Oauth 2.0进行身份验证。我开始在php开发只是因为我能够找到一些帮助我走上正轨的例子。在几天之前,我对这个领域知之甚少,如果你想知道我为什么在下面的代码中尝试某种方法而不是其他方法,那么简单的答案就是这就是我找到的。

我能够成功开发一个页面,该页面会征求Google的代码回复,以访问我自己的个人资料。我还能够成功开发位于所需重定向位置的页面,该页面将获取该代码,将其传递回google并请求访问令牌和刷新令牌,这些令牌已成功写入我网站上受密码保护的目录中的文件。我还能够成功开发一个页面,将刷新令牌传递回谷歌并接收更新的访问令牌,并在必要时将其写入文件。所有这些都是在php中完成的。

现在我所有这一切的主要目标是能够将融合表样式写入新的融合表。我目前在谷歌文档帐户中有许多完全开发的融合表(以及正确的样式)。我还上传了一个测试融合表,该表已经完全开发了数据但还没有设计样式。我试图简单地编写一些代码,从现有的完全开发的FT中获取样式,并将相同的样式写入此测试FT。

我已经能够从现有FT成功获取样式JSON对象并修改该JSON对象,使其表id属性更改为测试FT,以便JSON对象可以传递回测试FT并写入进入风格。

然而,当我尝试将样式数据传回谷歌以通过POST更新测试FT时,我收到一个错误,打印出“{”错误“:{”errors“:[{”domain“:”global“ ,“reason”:“authError”,“message”:“Invalid Credentials”,“locationType”:“header”,“location”:“Authorization”}],“code”:401,“message”:“Invalid Credentials” “

我完全有可能错误地格式化POST。但是,我没有使用访问令牌做任何花哨的事情(到目前为止)。我只是提出请求,从谷歌收到它并将其复制并直接粘贴到代码中,这样就不会有分配变量和/或超时的问题。

这是我的代码,我希望这是一个非常简单的过程,某些敏感数据项被编辑但描述。如果可以,请提供建议。

<html>
<head>
<title>Google Fusion Tables API Example</title>
</head>
<body>

<?php

  //table id of the FT that has fully developed styling.
  $strTableID = '1r8CRtGalQ3vC0zd_xmsChzjALlriiV5UDYFVOJU';

  //prepare your cURL request for GET of FT styling data from existing table.  Initialize it, set the options and then execute it.
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/fusiontables/v1/tables/'.$strTableID.'/styles/1?&key=redactedKey');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $result = curl_exec($ch);
  curl_close($ch);
  //print result to see if it works (it works)
  echo "<br> Result: $result";

  //the result returns as a JSON object.  Decode the object into a standard array, then display the individual elements of the array to see that it worked.
  $jsonResult = json_decode($result,true);
  echo "<br><br> JSON Result: ".$jsonResult['polygonOptions']['fillColorStyler']['columnName'];
  echo "<br> Table ID: ".$jsonResult['tableId'];

  //update the tableID and the bound column
  //this is the table id of the test FT
  $strTableID = '1CnecsDL67YHjBzSmfLjODRWxHDuC39frZEaTEKQ';
  $jsonResult['tableId'] = $strTableID;
  $jsonResult['polygonOptions']['fillColorStyler']['columnName'] = 'redacted column name';
  //print out the updated new JSON elements to see that they were properly applied (works)
  echo "<br><br> JSON Result: ".$jsonResult['polygonOptions']['fillColorStyler']['columnName'];
  echo "<br> Table ID: ".$jsonResult['tableId'];

  //Re-encode the array into a JSON object
  $jsonWrite = json_encode($jsonResult);


  $postField = 'access_token=redactedAccessToken in the form of ya29.AHE...Rdw';
  //set your header type so that Google knows what type of data it is receiving
  $arrHeader = array('Content-Type'=>'application/json');
  $url = "https://www.googleapis.com/fusiontables/v1/tables/".$strTableID."/styles";

  //prepare your cURL request.  Initialize it, set the options and then execute it.
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $arrHeader);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $postField.'&'.$jsonWrite);
  $result = curl_exec($ch);
  curl_close($ch);
  //print out the response to see if it worked (doesn't work)
  echo "<br><br>Post Result: $result";

?>
</body>
</html>

我也尝试了一种替代方法。我已经尝试将访问令牌放入POST的标题中:

$arrHeader = array('Content-Type'=>'application/json', 'access_token'=>'redactedAccessToken in the form of ya29.AHE...Rdw');

然后简化Post Fields选项:

curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonWrite);

这会返回一个不同的错误:“{”error“:{”errors“:[{”domain“:”global“,”reason“:”required“,”message“:”Login Required“,”locationType“ :“标题”,“位置”:“授权”}],“代码”:401,“消息”:“需要登录”}}“

如果可以,请提供任何帮助。谢谢你的时间。

1 个答案:

答案 0 :(得分:4)

访问令牌应作为授权:Bearer HTTP标头或URL中的access_token参数值发送。

要作为Authorization:Bearer标头发送,请再次使用$ arrHeader变量,但将代码行更新为以下内容:

$arrHeader = array('Content-Type'=>'application/json', 'Authorization'=>'Bearer <your_access_token>');

或者,如果您想使用access_token参数,请更新以下行,不要在帖子正文中发送访问令牌:

  curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/fusiontables/v1/tables/'.$strTableID.'/styles/1?&key=redactedKey&access_token=<your_access_token>');