2015-11-24 3 views
5

Я использую клиент API Google для чтения писем из Gmail. Теперь я хочу добавить Cronjob, чтобы он каждые 5 минут читал письма.Google API Client и Cronjob

Проблема с использованием Клиента Google API заключается в том, что он должен позволить пользователю сначала щелкнуть ссылку авторизации и разрешить пользователю использовать Клиента API Google.

У меня есть класс Inbox с функцией инициализации, которая инициализирует клиента API Google. Но cronjob не работает, потому что мне нужно получить access_token.

public function initialize() { 
    $configuration = Configuration::getConfiguration('class_Inbox'); 

    // Creates the Google Client 
    $this->client = new Google_Client(); 
    $this->client->setApplicationName('Tiptsernetwork'); 
    $this->client->setClientId($configuration['clientId']); 
    $this->client->setClientSecret($configuration['clientSecret']); 
    $this->client->setRedirectUri('http://www.tipsternetwork.nl/cronjob/authenticate'); 
    $this->client->addScope('https://mail.google.com/'); 
    $this->client->setApprovalPrompt('force'); 
    $this->client->setAccessType('offline'); 

    // Creates the Google Gmail Service 
    $this->service = new Google_Service_Gmail($this->client); 

    // Authenticates the user. 
    if (isset($_GET['code'])) { 
     $this->authenticate($_GET['code']); 
    } 

    // Check if we have an access token in the session 
    if (isset($_SESSION['access_token'])) { 
     $this->client->setAccessToken($_SESSION['access_token']); 
    } else { 
     $loginUrl = $this->client->createAuthUrl(); 
     echo '<a href="'.$loginUrl.'">Click Here</a>'; 
    } 

    // If the token is expired it used the refresh token to generate a new Access Token 
    if($this->client->isAccessTokenExpired()) { 
     $this->client->refreshToken($configuration['refreshToken']); 
    } 
} 

public function authenticate($code) { 
    // Creates and sets the Google Authorization Code 
    $this->client->authenticate($code); 
    $_SESSION['access_token'] = $this->client->getAccessToken(); 

    $this->client->refreshToken($configuration['refreshToken']); 

    // Redirect the user back after authorizaton 
    $url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; 
    header('Location: ' . filter_var($url, FILTER_VALIDATE_URL)); 
} 

Вы, ребята, знаете, как исправить это, используя токен обновления или что-то еще? Я не могу заставить его работать, и у меня нет идей.

Если я получить доступ к URL и нажмите на «Нажмите здесь» и позволяют это работает успешно, но не с Cronjob, потому что я не могу нажать на «Нажмите здесь» URL ...

Я надеюсь, вы, люди, понимаете это и можете мне помочь :).

С наилучшими пожеланиями,
Яник

ответ

3

Этот ответ является более общий подход на как использовать O-Flow auth2, так как я столкнулся с подобной проблемой некоторое время назад. Надеюсь, это поможет.

Одна из возможных проблем (при правильном использовании OAuth) заключается в том, что вы используете force в качестве приглашения на утверждение. Почему вы вынуждаете пользователя давать разрешение, когда он уже это сделал?

Когда пользователь пытается защитить себя от вашего бэкэнда, он спрашивает, хочет ли он предоставить разрешение вашего приложения на действия, указанные в scope. В первый раз, когда ваше приложение получит эти разрешения (нажав кнопку «Согласен»), ваш скрипт получит access_token и refresh_token из Google.

access_token используется для доступа к API Google с учетной записью этого аутентифицированного пользователя. Вы должны сохранить это где-нибудь на своем сервере, если хотите получить доступ к API Google без присутствия пользователя (так называемый offline-access). С помощью этого токена вы можете делать что угодно во имя пользователя (ограниченное определенными областями). Он пойдет недействительно через 1 час или около того. За все время (1 час) вы можете использовать этот токен без присутствия пользователя!

refresh_token необходим, если access_token недействителен после этого периода времени. И только тогда. Вы получаете только refresh_tokenОДИН РАЗ, и он никогда не изменится. Это очень важные данные и должны храниться безопасно!

Поэтому, если вы хотите получить доступ к API Google без присутствия пользователя, вам необходимо выполнить вызовы API с сохраненным access_token. Если ответ - это что-то вроде token expired (я думаю, что для этого был код ошибки - нужно провести исследование), то вы вызываете $client->refreshToken($refreshToken) с токеном обновления, который вы сохранили где-то в безопасности. Вы получите новый access_token. С помощью этого access_token вы можете выполнять дальнейшую работу, не заставляя пользователя щелкнуть где-нибудь (снова).

В следующий раз, когда новый access_token недействителен, вы должны использовать тот же самый refresh_token, как и прежде, и именно поэтому этот refresh_token так важен.

Надеюсь, я мог бы помочь вам немного. Если нет, прокомментируйте это.

Happy кодирования

Ресурсы

Смежные вопросы