File indexing completed on 2024-12-22 05:36:46
0001 <?php 0002 0003 /** 0004 * Zend Framework 0005 * 0006 * LICENSE 0007 * 0008 * This source file is subject to the new BSD license that is bundled 0009 * with this package in the file LICENSE.txt. 0010 * It is also available through the world-wide-web at this URL: 0011 * http://framework.zend.com/license/new-bsd 0012 * If you did not receive a copy of the license and are unable to 0013 * obtain it through the world-wide-web, please send an email 0014 * to license@zend.com so we can send you a copy immediately. 0015 * 0016 * @category Zend 0017 * @package Zend_Gdata 0018 * @subpackage Gdata 0019 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0020 * @license http://framework.zend.com/license/new-bsd New BSD License 0021 * @version $Id$ 0022 */ 0023 0024 /** 0025 * Zend_Gdata_HttpClient 0026 */ 0027 // require_once 'Zend/Gdata/HttpClient.php'; 0028 0029 /** 0030 * Zend_Version 0031 */ 0032 // require_once 'Zend/Version.php'; 0033 0034 /** 0035 * Wrapper around Zend_Http_Client to facilitate Google's "Account Authentication 0036 * Proxy for Web-Based Applications". 0037 * 0038 * @see http://code.google.com/apis/accounts/AuthForWebApps.html 0039 * 0040 * @category Zend 0041 * @package Zend_Gdata 0042 * @subpackage Gdata 0043 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0044 * @license http://framework.zend.com/license/new-bsd New BSD License 0045 */ 0046 class Zend_Gdata_AuthSub 0047 { 0048 0049 const AUTHSUB_REQUEST_URI = 'https://www.google.com/accounts/AuthSubRequest'; 0050 0051 const AUTHSUB_SESSION_TOKEN_URI = 'https://www.google.com/accounts/AuthSubSessionToken'; 0052 0053 const AUTHSUB_REVOKE_TOKEN_URI = 'https://www.google.com/accounts/AuthSubRevokeToken'; 0054 0055 const AUTHSUB_TOKEN_INFO_URI = 'https://www.google.com/accounts/AuthSubTokenInfo'; 0056 0057 /** 0058 * Creates a URI to request a single-use AuthSub token. 0059 * 0060 * @param string $next (required) URL identifying the service to be 0061 * accessed. 0062 * The resulting token will enable access to the specified service only. 0063 * Some services may limit scope further, such as read-only access. 0064 * @param string $scope (required) URL identifying the service to be 0065 * accessed. The resulting token will enable 0066 * access to the specified service only. 0067 * Some services may limit scope further, such 0068 * as read-only access. 0069 * @param int $secure (optional) Boolean flag indicating whether the 0070 * authentication transaction should issue a secure 0071 * token (1) or a non-secure token (0). Secure tokens 0072 * are available to registered applications only. 0073 * @param int $session (optional) Boolean flag indicating whether 0074 * the one-time-use token may be exchanged for 0075 * a session token (1) or not (0). 0076 * @param string $request_uri (optional) URI to which to direct the 0077 * authentication request. 0078 */ 0079 public static function getAuthSubTokenUri($next, $scope, $secure=0, $session=0, 0080 $request_uri = self::AUTHSUB_REQUEST_URI) 0081 { 0082 $querystring = '?next=' . urlencode($next) 0083 . '&scope=' . urldecode($scope) 0084 . '&secure=' . urlencode($secure) 0085 . '&session=' . urlencode($session); 0086 return $request_uri . $querystring; 0087 } 0088 0089 0090 /** 0091 * Upgrades a single use token to a session token 0092 * 0093 * @param string $token The single use token which is to be upgraded 0094 * @param Zend_Http_Client $client (optional) HTTP client to use to 0095 * make the request 0096 * @param string $request_uri (optional) URI to which to direct 0097 * the session token upgrade 0098 * @return string The upgraded token value 0099 * @throws Zend_Gdata_App_AuthException 0100 * @throws Zend_Gdata_App_HttpException 0101 */ 0102 public static function getAuthSubSessionToken( 0103 $token, $client = null, 0104 $request_uri = self::AUTHSUB_SESSION_TOKEN_URI) 0105 { 0106 $client = self::getHttpClient($token, $client); 0107 0108 if ($client instanceof Zend_Gdata_HttpClient) { 0109 $filterResult = $client->filterHttpRequest('GET', $request_uri); 0110 $url = $filterResult['url']; 0111 $headers = $filterResult['headers']; 0112 $client->setHeaders($headers); 0113 $client->setUri($url); 0114 } else { 0115 $client->setUri($request_uri); 0116 } 0117 0118 try { 0119 $response = $client->request('GET'); 0120 } catch (Zend_Http_Client_Exception $e) { 0121 // require_once 'Zend/Gdata/App/HttpException.php'; 0122 throw new Zend_Gdata_App_HttpException($e->getMessage(), $e); 0123 } 0124 0125 // Parse Google's response 0126 if ($response->isSuccessful()) { 0127 $goog_resp = array(); 0128 foreach (explode("\n", $response->getBody()) as $l) { 0129 $l = chop($l); 0130 if ($l) { 0131 list($key, $val) = explode('=', chop($l), 2); 0132 $goog_resp[$key] = $val; 0133 } 0134 } 0135 return $goog_resp['Token']; 0136 } else { 0137 // require_once 'Zend/Gdata/App/AuthException.php'; 0138 throw new Zend_Gdata_App_AuthException( 0139 'Token upgrade failed. Reason: ' . $response->getBody()); 0140 } 0141 } 0142 0143 /** 0144 * Revoke a token 0145 * 0146 * @param string $token The token to revoke 0147 * @param Zend_Http_Client $client (optional) HTTP client to use to make the request 0148 * @param string $request_uri (optional) URI to which to direct the revokation request 0149 * @return boolean Whether the revokation was successful 0150 * @throws Zend_Gdata_App_HttpException 0151 */ 0152 public static function AuthSubRevokeToken($token, $client = null, 0153 $request_uri = self::AUTHSUB_REVOKE_TOKEN_URI) 0154 { 0155 $client = self::getHttpClient($token, $client); 0156 0157 if ($client instanceof Zend_Gdata_HttpClient) { 0158 $filterResult = $client->filterHttpRequest('GET', $request_uri); 0159 $url = $filterResult['url']; 0160 $headers = $filterResult['headers']; 0161 $client->setHeaders($headers); 0162 $client->setUri($url); 0163 $client->resetParameters(); 0164 } else { 0165 $client->setUri($request_uri); 0166 } 0167 0168 ob_start(); 0169 try { 0170 $response = $client->request('GET'); 0171 } catch (Zend_Http_Client_Exception $e) { 0172 ob_end_clean(); 0173 // require_once 'Zend/Gdata/App/HttpException.php'; 0174 throw new Zend_Gdata_App_HttpException($e->getMessage(), $e); 0175 } 0176 ob_end_clean(); 0177 // Parse Google's response 0178 if ($response->isSuccessful()) { 0179 return true; 0180 } else { 0181 return false; 0182 } 0183 } 0184 0185 0186 /** 0187 * get token information 0188 * 0189 * @param string $token The token to retrieve information about 0190 * @param Zend_Http_Client $client (optional) HTTP client to use to 0191 * make the request 0192 * @param string $request_uri (optional) URI to which to direct 0193 * the information request 0194 */ 0195 public static function getAuthSubTokenInfo( 0196 $token, $client = null, $request_uri = self::AUTHSUB_TOKEN_INFO_URI) 0197 { 0198 $client = self::getHttpClient($token, $client); 0199 0200 if ($client instanceof Zend_Gdata_HttpClient) { 0201 $filterResult = $client->filterHttpRequest('GET', $request_uri); 0202 $url = $filterResult['url']; 0203 $headers = $filterResult['headers']; 0204 $client->setHeaders($headers); 0205 $client->setUri($url); 0206 } else { 0207 $client->setUri($request_uri); 0208 } 0209 0210 ob_start(); 0211 try { 0212 $response = $client->request('GET'); 0213 } catch (Zend_Http_Client_Exception $e) { 0214 ob_end_clean(); 0215 // require_once 'Zend/Gdata/App/HttpException.php'; 0216 throw new Zend_Gdata_App_HttpException($e->getMessage(), $e); 0217 } 0218 ob_end_clean(); 0219 return $response->getBody(); 0220 } 0221 0222 /** 0223 * Retrieve a HTTP client object with AuthSub credentials attached 0224 * as the Authorization header 0225 * 0226 * @param string $token The token to retrieve information about 0227 * @param Zend_Gdata_HttpClient $client (optional) HTTP client to use to make the request 0228 */ 0229 public static function getHttpClient($token, $client = null) 0230 { 0231 if ($client == null) { 0232 $client = new Zend_Gdata_HttpClient(); 0233 } 0234 if (!$client instanceof Zend_Gdata_HttpClient) { 0235 // require_once 'Zend/Gdata/App/HttpException.php'; 0236 throw new Zend_Gdata_App_HttpException('Client is not an instance of Zend_Gdata_HttpClient.'); 0237 } 0238 $useragent = 'Zend_Framework_Gdata/' . Zend_Version::VERSION; 0239 $client->setConfig(array( 0240 'strictredirects' => true, 0241 'useragent' => $useragent 0242 ) 0243 ); 0244 $client->setAuthSubToken($token); 0245 return $client; 0246 } 0247 0248 }