2015-11-24 16 views
5

Google APIクライアントを使用してGmailからメールを読んでいます。今は5分ごとにメールを読むようにクロンジョブを追加したいと思っています。Google APIクライアントとCronjob

Google APIクライアントを使用する際の問題点は、ユーザーが認可リンクを最初にクリックし、Google APIクライアントを使用できるようにする必要があることです。

Google APIクライアントのinitliazesを初期化する関数を持つInboxクラスがあります。しかし、私はaccess_tokenを取得する必要があるので、cronjobは動作しません。

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にアクセスし、「ここをクリック」と私は「ここをクリック」URLをクリックすることができないので、それはcronジョブで正常ではなく、働くことを許可する...

をクリックしていた場合、私は願っていますあなたは人々がそれを理解し、私を助けることができます:)。

敬具、
Yanick

答えて

3

この答えは、私はしばらく前に同様の問題に直面しているので、O-AUTH2フローを使用する方法のより一般的なアプローチです。それが少し助けてくれることを願っています。

(OAuthの正しい使い方を理解する上で)1つの問題は、承認プロンプトとしてforceを使用することです。彼がすでに行ったときにユーザーに許可を与えなければならない理由は何ですか?

ユーザがあなたのバックエンドに対して黙認したとき、彼はscopeで定義されているアクションに対してアプリケーションに許可を与えたいかどうか尋ねました。アプリケーションがこのアクセス権を初めて取得すると(ユーザーが[同意する] - ボタンをクリックすると)、スクリプトはgo33からaccess_tokenrefresh_tokenとなります。

access_tokenは、認証されたユーザーのアカウントを使用してGoogle-APIにアクセスするために使用されます。ユーザーがいなくてもgoogle APIにアクセスしたい場合(つまり、オフラインアクセスと呼ばれる)、サーバーのどこかに保存する必要があります。このトークンを使用すると、ユーザーの名前で任意の操作を行うことができます(定義されたスコープに限定)。 1時間ほど後に無効になります。 (1時間のうちに)このトークンを使用することができます。

この期間の後にaccess_tokenの郵便番号が無効な場合は、refresh_tokenが必要です。そしてそれだけです。 refresh_tokenONCEのみ変更されることはありません。これは非常に重要なデータであり、安全に保管する必要があります。

ユーザーの存在なしでGoogle APIにアクセスするには、保存されたaccess_tokenでAPI呼び出しを行う必要があります。応答がtoken expiredのようなものであれば(それはエラーコードがあったと思います。調査をしなければなりません)、$client->refreshToken($refreshToken)に安全な場所に保存した更新トークンを呼び出します。あなたはそれから新しいaccess_tokenを得るでしょう。このaccess_tokenを使用すると、ユーザはどこかをクリックすることなく、さらに作業を行うことができます。

次回は新しいaccess_tokenのwentsが無効であることを前提として同じrefresh_tokenを使用する必要があります。これがrefresh_tokenがそれほど重要である理由です。

少しお手伝いできることを願っています。そうでない場合は、これにコメントしてください。

ハッピーコーディング

リソース