Пример #1
0
 /**
  * @param RequestAbstract $request
  * @param string $endpointUrl
  * @return \Guzzle\Http\EntityBodyInterface|string
  * @throws Exception\ConnectionError
  */
 private function sendRequest(RequestAbstract $request, $endpointUrl)
 {
     $client = new HttpClient();
     $client->setConfig(array('curl.options' => array(CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false)));
     $httpRequest = $client->post($endpointUrl, null, $request->getRawData());
     try {
         return $httpRequest->send()->getBody();
     } catch (RequestException $e) {
         throw new ConnectionError($e->getMessage());
     }
 }
Пример #2
0
    /**
     * 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)) {
            throw new App\AuthException(
                   'Please set your Google credentials before trying to ' .
                   'authenticate');
        }

        if ($client == null) {
            $client = new HttpClient();
        }
        
        if (!$client instanceof \Zend\Http\Client) {
            throw new App\HttpException(
                    'Client is not an instance of Zend\Http\Client.');
        }

        // Build the HTTP client for authentication
        $client->setUri($loginUri);
        $client->setMethod('POST');
        $useragent = $source . ' Zend_Framework_Gdata/' . \Zend\Version::VERSION;
        $client->setConfig(array(
                'maxredirects'    => 0,
                'strictredirects' => true,
                'useragent' => $useragent
            )
        );
        
        $client->setEncType('multipart/form-data');
        
        $postParams = array('accountType' => $accountType,
                            'Email'       => (string)$email,
                            'Passwd'      => (string) $password,
                            'service'     => (string) $service,
                            'source'      => (string) $source);
        
        if ($loginToken || $loginCaptcha) {
            if($loginToken && $loginCaptcha) {
                $postParams += array('logintoken' => (string)$loginToken, 
                                     'logincaptcha' => (string)$loginCaptcha);
            } else {
                throw new App\AuthException(
                    'Please provide both a token ID and a user\'s response ' .
                    'to the CAPTCHA challenge.');
            }
        }
        
        $client->setParameterPost($postParams);
        
        // 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->send();
        } catch (\Zend\Http\Client\Exception $e) {
            throw new App\HttpException($e->getMessage(), $e);
        }
        ob_end_clean();
        
        // Parse Google's response
        $goog_resp = array();
        foreach (explode("\n", $response->getBody()) as $l) {
            $l = rtrim($l);
            if ($l) {
                list($key, $val) = explode('=', rtrim($l), 2);
                $goog_resp[$key] = $val;
            }
        }

        if ($response->getStatusCode() == 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->getStatusCode() == 403) {
            // Check if the server asked for a CAPTCHA
            if (array_key_exists('Error', $goog_resp) &&
                $goog_resp['Error'] == 'CaptchaRequired') {
                throw new App\CaptchaRequiredException(
                    $goog_resp['CaptchaToken'], $goog_resp['CaptchaUrl']);
            }
            else {
                throw new App\AuthException('Authentication with Google failed. Reason: ' .
                    (isset($goog_resp['Error']) ? $goog_resp['Error'] : 'Unspecified.'));
            }
        }
    }