无法获得Google OAuth令牌

时间:2014-03-17 15:34:20

标签: php oauth google-api-php-client

我正在尝试通过php脚本将日历事件添加到我的Google日历中。请注意,我可以直接通过Google测试page成功完成此操作,因此我认为我的日历设置正确。但是,当我尝试从php脚本执行此操作时,我无法获取OAuth2令牌。

以下脚本(主要来自Google示例)运行时没有错误,但总是会出现“Connect Me!”。链接。当我点击此链接时,它会转到验证屏幕,警告我此应用程序想要管理我的日历。我点击“接受”,然后点击我的日历。有点不方便,但如果这得到了OAuth令牌,那很好。

然后我回去再次运行脚本,希望访问令牌现在可用,但我得到的结果完全相同。无论我运行多少次这个脚本,我都不会获得令牌,我需要这些令牌来扩展脚本以将事件添加到日历中。

我已经在这里待了好几天了,我只是没有到达任何地方。有人可以帮忙吗?感谢。

<?php
require_once '../../src/Google_Client.php';
require_once '../../src/contrib/Google_CalendarService.php';
require_once '../../src/auth/Google_OAuth2.php';

session_start();

$client = new Google_Client();
$client->setApplicationName("Add Google Calendar Entries");

// Visit https://code.google.com/apis/console?api=calendar to generate your
// client id, client secret, and to register your redirect uri.
$client->setClientId('843319906820-1s1d737e77o71a3vaskf434k3ape1fk5.apps.googleusercontent.com');
$client->setClientSecret('AP5imn3e0TEWNyLTCNm8YJj6');
$client->setRedirectUri('https://www.google.com/calendar/');
$client->setDeveloperKey('AIzaSyDIw3ks7AmrIrRxjO9y2gWBhQDYHFWd-uc');
$client->setUseObjects(true);

$cal = new Google_CalendarService($client);

if (isset($_GET['logout'])) {
  unset($_SESSION['token']);
}

if (isset($_GET['code'])) {
  $client->authenticate($_GET['code']);
  $_SESSION['token'] = $client->getAccessToken();
  header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
}

if (isset($_SESSION['token'])) {
  $client->setAccessToken($_SESSION['token']);
}

if ($client->getAccessToken()) {
  $calList = $cal->calendarList->listCalendarList();
  print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>";

  $_SESSION['token'] = $client->getAccessToken();

} else {
  $authUrl = $client->createAuthUrl();
  print "<a class='login' href='$authUrl'>Connect Me!</a>";
}

?>

编辑:试图实施Vinicius Pinto的建议。我已将我的重定向更改为直接指向此脚本。现在我收到了这个错误:

  

致命错误:带有消息的未捕获异常'Google_ServiceException'   '调用GET时出错   https://www.googleapis.com/calendar/v3/users/me/calendarList?key=AIzaSyDIw3ks7AmrIrRxjO9y2gWBhQDYHFWd-uc:   (403)访问未配置。请使用Google Developers Console   激活项目的API。'在   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \ IO \ Google_REST.php:66   堆栈跟踪:#0   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \ IO \ Google_REST.php(36):   Google_REST :: decodeHttpResponse(Object(Google_HttpRequest))#1   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \服务\ Google_ServiceResource.php(186):   Google_REST :: execute(Object(Google_HttpRequest))#2   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \的contrib \ Google_CalendarService.php(205):   Google_ServiceResource-&gt; __ call('list',Array)#3   d:\主机\ 11347607 \ HTML \脚本\ Google处理API-PHP-客户\例子\日历\ simple.php(43):   Google_CalendarListServiceResource-&gt; listCalen in   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \ IO \ Google_REST.php   在第66行

似乎我没有在开发者控制台中激活正确的API。我激活了Calendar APIGoogle Cloud Storage JSON API,没有其他任何内容。我没有看到任何其他相关的API,我不认为这条消息告诉我它想要哪些API。

编辑2:看起来我使用了错误的开发人员密钥。我已将其更改为服务器应用程序的密钥。现在我的错误是:

  

致命错误:带有消息的未捕获异常'Google_AuthException'   '刷新OAuth2令牌时出错,消息:'{“error”:   “invalid_client”}''in   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \权威性\ Google_OAuth2.php:288   堆栈跟踪:#0   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \权威性\ Google_OAuth2.php(248):   Google_OAuth2-&gt; refreshTokenRequest(数组)#1   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \权威性\ Google_OAuth2.php(225):   Google_OAuth2-&gt; refreshToken('1 / 6ZdJyZALqcbwW ...')#2   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \服务\ Google_ServiceResource.php(167):   Google_OAuth2-&gt; sign(对象(Google_HttpRequest))#3   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \的contrib \ Google_CalendarService.php(205):   Google_ServiceResource-&gt; __ call('list',Array)#4   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端\例子\日历\ simple.php(47):   Google_CalendarListServiceResource-&gt; listCalendarList()in   d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \权威性\ Google_OAuth2.php   在第288行

1 个答案:

答案 0 :(得分:1)

$client->setRedirectUri()应该会收到指向您的应用程序的网址,因为这是您在Google网页中授权应用程序后重定向到的网址。这就是您重定向到日历的原因,因为您使用的是日历网址。

您的脚本似乎已经期待$ _GET ['code'],因此请尝试将重定向网址设置为此脚本的网址。您还需要在开发人员控制台中的API下设置相同的网址 - &gt;凭证。

当您使用值代码调用$client->authenticate($_GET['code']);时,您只会获得一个令牌。

看看this lib I just commited to Github,这是一个早期版本,但它运行正常(我正在使用YouTube访问)。它正在使用new official library

更新:正如评论中所述,即使所有Google示例代码都设置了开发人员密钥,但实际上并不需要开发人员密钥。