3

サービスアカウントを使用してGoogleカレンダーにアクセスしたいのですが。これは私のコードです: <NUMBER>GoogleAPIコンソールで正しい値を取るように置き換えられます。

<?php

require_once 'googleapi/Google_Client.php';
require_once 'googleapi/contrib/Google_CalendarService.php';

const CLIENT_ID = '<NUMBER>.apps.googleusercontent.com';
const SERVICE_ACCOUNT_NAME  = '<NUMBER>@developer.gserviceaccount.com';
const MY_EMAIL  = '<MY NAME>@gmail.com';
const KEY_FILE = 'privatekey.p12';

$client = new Google_Client();
$client->setClientId(CLIENT_ID);
$client->setApplicationName("<APP NAME>");

$key = file_get_contents(KEY_FILE);
$client->setAssertionCredentials(new Google_AssertionCredentials(
    SERVICE_ACCOUNT_NAME,
    array('https://www.googleapis.com/auth/calendar'),
    $key,
    'notasecret',
    'http://oauth.net/grant_type/jwt/1.0/bearer',
    MY_EMAIL)
);

$cal = new Google_CalendarService($client);
$calList = $cal->calendarList->listCalendarList();

print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>";

コードを実行すると、次のようになります。

致命的なエラー:キャッチされない例外'Google_AuthException'とメッセージ'OAuth2トークンの更新エラー、メッセージ:' {"error": "access_denied"}'' in /home/www/65683f67e3f0d94b14bba3c945014cda/web/intranet/googleapi/auth/Google_OAuth2.php :279スタックトレース:#0 /home/www/65683f67e3f0d94b14bba3c945014cda/web/intranet/googleapi/auth/Google_OAuth2.php(256):Google_OAuth2-> refreshTokenRequest(Array)#1 / home / www / 65683f67e3f0d94b14bba3c945014cda / web /auth/Google_OAuth2.php(209):Google_OAuth2-> refreshTokenWithAssertion()#2 /home/www/65683f67e3f0d94b14bba3c945014cda/web/intranet/googleapi/service/Google_ServiceResource.php(166):Google_OAuth2->sign(Object(Google_HttpRequest))#3 /home/www/65683f67e3f0d94b14bba3c945014cda/web/intranet/googleapi/contrib/Google_CalendarService.php(154):Google_ServiceResource-> __ call('list'、Array)#4 / home / www / 65683f67e3f0d94b14 /web/intranet/testService.php(32):Google_CalendarListServiceResource-> listCalendarList()#5{main}が/home / www/65683f67e3f0d94b14bba3c945014cda/web/intranet/googleapi/auth/Google_OAuth2.phpの279行目にスローされます

コードを次のように変更した場合:

$client->setAssertionCredentials(new Google_AssertionCredentials(
SERVICE_ACCOUNT_NAME,
array('https://www.googleapis.com/auth/calendar'),
$key));

私は受け取ります:

(403)アクセスが構成されていません

ここで何が問題になっていますか?

4

1 に答える 1

3

私は解決策を持っています。最初の良いコードは最後です:

$client->setAssertionCredentials(new Google_AssertionCredentials(
      SERVICE_ACCOUNT_NAME,
      array('https://www.googleapis.com/auth/calendar'),
      $key));

問題はコードではなく、私の Google アカウントです。Google API コンソールでリファラーについて言及しました。フィールドを消去した後、コードは機能します。

参考までに、共有カレンダーにアクセスしたい場合は、カレンダーを XXXXXX@developer.gserviceaccount.com (SERVICE_ACCOUNT_NAME) と共有することを忘れないでください。

詳細については、次を参照してください。

https://groups.google.com/forum/?fromgroups=#!topic/google-ajax-search-api/kaKYuUstwB0/discussion

于 2012-10-29T08:16:27.583 に答える