Доступ к API Календаря Google с помощью Application-Specifi c Пароль - PullRequest
0 голосов
/ 14 февраля 2020

Я работаю над сценарием cron, чтобы ежедневно проверять календарь Google. Я хотел бы знать, можно ли использовать Application-Specifi c Пароли (см .: https://support.google.com/accounts/answer/185833?hl=it) и вставить сгенерированный пароль в мой скрипт. OAUTH требует взаимодействия с пользователем, и, поскольку я работаю над сценарием, я не могу следовать по этому пути. Я также читал о «учетных записях служб», но надеюсь, что смогу избежать этого, просто используя Application-Specifi c Пароли. Какая разница? Любой намек?

Большое спасибо Francesco

EDIT1: код, который я пытаюсь использовать:

<?php
require __DIR__ . '/vendor/autoload.php';

$client = new Google_Client();
//The json file you got after creating the service account
putenv('GOOGLE_APPLICATION_CREDENTIALS=test-calendario-268115-5452ff6f57e8.json');
$client->useApplicationDefaultCredentials();
$client->setApplicationName("test_calendar");
$client->setScopes(Google_Service_Calendar::CALENDAR);
$client->setAccessType('offline');

$service = new Google_Service_Calendar($client);

$calendarList = $service->calendarList->listCalendarList();

EDIT2: $ service-> calendarList-> listCalendarList () дает использование пустого списка:

<?php
require __DIR__ . '/vendor/autoload.php';

$client = new Google_Client();
//The json file you got after creating the service account
putenv('GOOGLE_APPLICATION_CREDENTIALS=test-calendario-268115-5452ff6f57e8.json');
$client->useApplicationDefaultCredentials();
$client->setApplicationName("test_calendar");
$client->setScopes(Google_Service_Calendar::CALENDAR);
$client->setAccessType('offline');

$service = new Google_Service_Calendar($client);

$listEvents = $service->events->listEvents("...@group.calendar.google.com");// taken from sharing calendar settings
$events = $listEvents->getItems();
print_r($events);

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Вы, похоже, сталкиваетесь с такой ситуацией, которая упоминается в на этой странице справки Календаря .

Имейте в виду, что это также относится к учетным записям служб.

enter image description here

принятый ответ на этот вопрос ...

Объясняет, что вы можете использовать метод CalendarList: insert для добавления календаря в список календаря.

0 голосов
/ 14 февраля 2020

Существует два способа аутентификации в API Календаря Google.

  • OAuth2 запрашивает у пользователя доступ. (Не предназначено для взаимодействия сервер-сервер, но может быть выполнено, если пользователь создает токен refre sh, а затем сохраняет его там, где сервер может получить к нему доступ позже.)
  • Использование учетных данных авторизованной учетной записи службы. (Идеально подходит для сервера-сервера).

Нет другого способа доступа к данным пользователей, для которых вам необходимо иметь их разрешение.

Просмотр Использование OAuth 2.0 для сервера для Серверные приложения .

учетная запись службы

require_once __DIR__ . '/vendor/autoload.php';

// Use the developers console and download your service account
// credentials in JSON format. Place the file in this directory or
// change the key file location if necessary.
putenv('GOOGLE_APPLICATION_CREDENTIALS='.__DIR__.'/service-account.json');

/**
 * Gets the Google client refreshing auth if needed.
 * Documentation: https://developers.google.com/identity/protocols/OAuth2ServiceAccount
 * Initializes a client object.
 * @return A google client object.
 */
function getGoogleClient() {
    return getServiceAccountClient();
}

/**
 * Builds the Google client object.
 * Documentation: https://developers.google.com/api-client-library/php/auth/service-accounts
 * Scopes will need to be changed depending upon the API's being accessed. 
 * array(Google_Service_Analytics::ANALYTICS_READONLY, Google_Service_Analytics::ANALYTICS)
 * List of Google Scopes: https://developers.google.com/identity/protocols/googlescopes
 * @return A google client object.
 */
function getServiceAccountClient() {
    try {   
        // Create and configure a new client object.        
        $client = new Google_Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope([YOUR SCOPES HERE]);
        return $client;
    } catch (Exception $e) {
        print "An error occurred: " . $e->getMessage();
    }
}

код, извлеченный из ServiceAccount. php

...