/**
  * Updates the request with an Authorization header when auth is 'fetched_auth_token'.
  *
  *   use GuzzleHttp\Client;
  *   use Google\Auth\OAuth2;
  *   use Google\Auth\Subscriber\AuthTokenSubscriber;
  *
  *   $config = [..<oauth config param>.];
  *   $oauth2 = new OAuth2($config)
  *   $subscriber = new AuthTokenSubscriber(
  *       $oauth2,
  *       ['prefix' => 'OAuth2::'],
  *       $cache = new Memcache()
  *   );
  *
  *   $client = new Client([
  *      'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
  *      'defaults' => ['auth' => 'google_auth']
  *   ]);
  *   $client->getEmitter()->attach($subscriber);
  *
  *   $res = $client->get('myproject/taskqueues/myqueue');
  *
  * @param BeforeEvent $event
  */
 public function onBefore(BeforeEvent $event)
 {
     // Requests using "auth"="google_auth" will be authorized.
     $request = $event->getRequest();
     if ($request->getConfig()['auth'] != 'google_auth') {
         return;
     }
     // Use the cached value if its available.
     //
     // TODO: correct caching; update the call to setCachedValue to set the expiry
     // to the value returned with the auth token.
     //
     // TODO: correct caching; enable the cache to be cleared.
     $cached = $this->getCachedValue();
     if (!empty($cached)) {
         $request->setHeader('Authorization', 'Bearer ' . $cached);
         return;
     }
     // Fetch the auth token.
     $auth_tokens = $this->fetcher->fetchAuthToken($this->httpHandler);
     if (array_key_exists('access_token', $auth_tokens)) {
         $request->setHeader('Authorization', 'Bearer ' . $auth_tokens['access_token']);
         $this->setCachedValue($auth_tokens['access_token']);
         // notify the callback if applicable
         if ($this->tokenCallback) {
             call_user_func($this->tokenCallback, $this->getFullCacheKey(), $auth_tokens['access_token']);
         }
     }
 }
 /**
  * Implements FetchAuthTokenInterface#fetchAuthToken.
  *
  * Checks the cache for a valid auth token and fetches the auth tokens
  * from the supplied fetcher.
  *
  * @param callable $httpHandler callback which delivers psr7 request
  *
  * @return array the response
  *
  * @throws \Exception
  */
 public function fetchAuthToken(callable $httpHandler = null)
 {
     // Use the cached value if its available.
     //
     // TODO: correct caching; update the call to setCachedValue to set the expiry
     // to the value returned with the auth token.
     //
     // TODO: correct caching; enable the cache to be cleared.
     $cacheKey = $this->fetcher->getCacheKey();
     $cached = $this->getCachedValue($cacheKey);
     if (!empty($cached)) {
         return ['access_token' => $cached];
     }
     $auth_token = $this->fetcher->fetchAuthToken($httpHandler);
     if (isset($auth_token['access_token'])) {
         $this->setCachedValue($cacheKey, $auth_token['access_token']);
     }
     return $auth_token;
 }
 /**
  * Call fetcher to fetch the token.
  *
  * @return string
  */
 private function fetchToken()
 {
     $auth_tokens = $this->fetcher->fetchAuthToken($this->httpHandler);
     if (array_key_exists('access_token', $auth_tokens)) {
         // notify the callback if applicable
         if ($this->tokenCallback) {
             call_user_func($this->tokenCallback, $this->fetcher->getCacheKey(), $auth_tokens['access_token']);
         }
         return $auth_tokens['access_token'];
     }
 }
 /**
  * Updates the request with an Authorization header when auth is 'fetched_auth_token'.
  *
  *   use GuzzleHttp\Client;
  *   use Google\Auth\OAuth2;
  *   use Google\Auth\Subscriber\AuthTokenSubscriber;
  *
  *   $config = [..<oauth config param>.];
  *   $oauth2 = new OAuth2($config)
  *   $subscriber = new AuthTokenSubscriber($oauth2);
  *
  *   $client = new Client([
  *      'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
  *      'defaults' => ['auth' => 'google_auth']
  *   ]);
  *   $client->getEmitter()->attach($subscriber);
  *
  *   $res = $client->get('myproject/taskqueues/myqueue');
  *
  * @param BeforeEvent $event
  */
 public function onBefore(BeforeEvent $event)
 {
     // Requests using "auth"="google_auth" will be authorized.
     $request = $event->getRequest();
     if ($request->getConfig()['auth'] != 'google_auth') {
         return;
     }
     // Fetch the auth token.
     $auth_tokens = $this->fetcher->fetchAuthToken($this->httpHandler);
     if (array_key_exists('access_token', $auth_tokens)) {
         $request->setHeader('Authorization', 'Bearer ' . $auth_tokens['access_token']);
         // notify the callback if applicable
         if ($this->tokenCallback) {
             call_user_func($this->tokenCallback, $this->fetcher->getCacheKey(), $auth_tokens['access_token']);
         }
     }
 }
 /**
  * Determine if token is available in the cache, if not call fetcher to
  * fetch it.
  *
  * @return string
  */
 private function fetchToken()
 {
     // TODO: correct caching; update the call to setCachedValue to set the expiry
     // to the value returned with the auth token.
     //
     // TODO: correct caching; enable the cache to be cleared.
     $cached = $this->getCachedValue();
     if (!empty($cached)) {
         return $cached;
     }
     $auth_tokens = $this->fetcher->fetchAuthToken($this->httpHandler);
     if (array_key_exists('access_token', $auth_tokens)) {
         $this->setCachedValue($auth_tokens['access_token']);
         // notify the callback if applicable
         if ($this->tokenCallback) {
             call_user_func($this->tokenCallback, $this->getFullCacheKey(), $auth_tokens['access_token']);
         }
         return $auth_tokens['access_token'];
     }
 }