/** * Set Google authentication credentials. * Must be done before trying to do any Google Data operations that * require authentication. * For example, viewing private data, or posting or deleting entries. * * @param string $email * @param string $password * @param string $service * @param Zend_Gdata_HttpClient $client * @param string $source * @param string $loginToken The token identifier as provided by the server. * @param string $loginCaptcha The user's response to the CAPTCHA challenge. * @param string $accountType An optional string to identify whether the * account to be authenticated is a google or a hosted account. Defaults to * 'HOSTED_OR_GOOGLE'. See: http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html#Request * @throws Zend_Gdata_App_AuthException * @throws Zend_Gdata_App_HttpException * @throws Zend_Gdata_App_CaptchaRequiredException * @return Zend_Gdata_HttpClient */ public static function getHttpClient($email, $password, $service = 'xapi', $client = null, $source = self::DEFAULT_SOURCE, $loginToken = null, $loginCaptcha = null, $loginUri = self::CLIENTLOGIN_URI, $accountType = 'HOSTED_OR_GOOGLE') { if (!($email && $password)) { // require_once 'Zend/Gdata/App/AuthException.php'; throw new Zend_Gdata_App_AuthException('Please set your Google credentials before trying to ' . 'authenticate'); } if ($client == null) { $client = new Zend_Gdata_HttpClient(); } if (!$client instanceof Zend_Http_Client) { // require_once 'Zend/Gdata/App/HttpException.php'; throw new Zend_Gdata_App_HttpException('Client is not an instance of Zend_Http_Client.'); } // Build the HTTP client for authentication $client->setUri($loginUri); $useragent = $source . ' Zend_Framework_Gdata/' . Zend_Version::VERSION; $client->setConfig(array('maxredirects' => 0, 'strictredirects' => true, 'useragent' => $useragent)); $client->setParameterPost('accountType', $accountType); $client->setParameterPost('Email', (string) $email); $client->setParameterPost('Passwd', (string) $password); $client->setParameterPost('service', (string) $service); $client->setParameterPost('source', (string) $source); if ($loginToken || $loginCaptcha) { if ($loginToken && $loginCaptcha) { $client->setParameterPost('logintoken', (string) $loginToken); $client->setParameterPost('logincaptcha', (string) $loginCaptcha); } else { // require_once 'Zend/Gdata/App/AuthException.php'; throw new Zend_Gdata_App_AuthException('Please provide both a token ID and a user\'s response ' . 'to the CAPTCHA challenge.'); } } // Send the authentication request // For some reason Google's server causes an SSL error. We use the // output buffer to supress an error from being shown. Ugly - but works! ob_start(); try { $response = $client->request('POST'); } catch (Zend_Http_Client_Exception $e) { // require_once 'Zend/Gdata/App/HttpException.php'; throw new Zend_Gdata_App_HttpException($e->getMessage(), $e); } ob_end_clean(); // Parse Google's response $goog_resp = array(); foreach (explode("\n", $response->getBody()) as $l) { $l = chop($l); if ($l) { list($key, $val) = explode('=', chop($l), 2); $goog_resp[$key] = $val; } } if ($response->getStatus() == 200) { $client->setClientLoginToken($goog_resp['Auth']); $useragent = $source . ' Zend_Framework_Gdata/' . Zend_Version::VERSION; $client->setConfig(array('strictredirects' => true, 'useragent' => $useragent)); return $client; } elseif ($response->getStatus() == 403) { // Check if the server asked for a CAPTCHA if (array_key_exists('Error', $goog_resp) && $goog_resp['Error'] == 'CaptchaRequired') { // require_once 'Zend/Gdata/App/CaptchaRequiredException.php'; throw new Zend_Gdata_App_CaptchaRequiredException($goog_resp['CaptchaToken'], $goog_resp['CaptchaUrl']); } else { // require_once 'Zend/Gdata/App/AuthException.php'; throw new Zend_Gdata_App_AuthException('Authentication with Google failed. Reason: ' . (isset($goog_resp['Error']) ? $goog_resp['Error'] : 'Unspecified.')); } } }
/** * @expectedException Zend_Gdata_App_HttpException */ public function testGetAuthSubTokenInfoCatchesHttpClientException() { $adapter = new Zend_Http_Client_Adapter_Test(); $adapter->setNextRequestWillFail(true); $client = new Zend_Gdata_HttpClient(); $client->setUri('http://example.com/AuthSub'); $client->setAdapter($adapter); $revoked = Zend_Gdata_AuthSub::getAuthSubTokenInfo($this->token, $client); }