Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

AbstractService.php

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 9.88 KiB


 001  <?php
 002  namespace OAuth\OAuth1\Service;
 003   
 004  use OAuth\Common\Consumer\Credentials;
 005  use OAuth\Common\Storage\TokenStorageInterface;
 006  use OAuth\Common\Http\Exception\TokenResponseException;
 007  use OAuth\Common\Http\Client\ClientInterface;
 008  use OAuth\Common\Http\Uri\UriInterface;
 009  use OAuth\OAuth1\Signature\SignatureInterface;
 010  use OAuth\OAuth1\Token\TokenInterface;
 011  use OAuth\OAuth1\Token\StdOAuth1Token;
 012  use OAuth\Common\Service\AbstractService as BaseAbstractService;
 013   
 014  abstract class AbstractService extends BaseAbstractService implements ServiceInterface
 015  {
 016   
 017      /** @const OAUTH_VERSION */
 018      const OAUTH_VERSION = 1;
 019   
 020      /** @var \OAuth\OAuth1\Signature\SignatureInterface */
 021      protected $signature;
 022   
 023      /** @var \OAuth\Common\Http\Uri\UriInterface|null */
 024      protected $baseApiUri;
 025   
 026      /**
 027       * @param \OAuth\Common\Consumer\Credentials $credentials
 028       * @param \OAuth\Common\Http\Client\ClientInterface $httpClient
 029       * @param \OAuth\Common\Storage\TokenStorageInterface $storage
 030       * @param \OAuth\OAuth1\Signature\SignatureInterface $signature
 031       * @param UriInterface|null $baseApiUri
 032       */
 033      public function __construct(Credentials $credentials, ClientInterface $httpClient, TokenStorageInterface $storage, SignatureInterface $signature, UriInterface $baseApiUri = null)
 034      {
 035          parent::__construct($credentials, $httpClient, $storage);
 036   
 037          $this->signature    = $signature;
 038          $this->baseApiUri   = $baseApiUri;
 039   
 040          $this->signature->setHashingAlgorithm($this->getSignatureMethod());
 041      }
 042   
 043      /**
 044       * Retrieves and stores the OAuth1 request token obtained from the service.
 045       *
 046       * @return TokenInterface $token
 047       * @throws TokenResponseException
 048       */
 049      public function requestRequestToken()
 050      {
 051          $authorizationHeader = array('Authorization' => $this->buildAuthorizationHeaderForTokenRequest());
 052          $headers = array_merge($authorizationHeader, $this->getExtraOAuthHeaders());
 053   
 054          $responseBody = $this->httpClient->retrieveResponse($this->getRequestTokenEndpoint(), array(), $headers);
 055   
 056          $token = $this->parseRequestTokenResponse($responseBody);
 057          $this->storage->storeAccessToken($this->service(), $token);
 058   
 059          return $token;
 060      }
 061   
 062      /**
 063       * Returns the url to redirect to for authorization purposes.
 064       *
 065       * @param array $additionalParameters
 066       * @return string
 067       */
 068      public function getAuthorizationUri( array $additionalParameters = array() )
 069      {
 070          // Build the url
 071          $url = clone $this->getAuthorizationEndpoint();
 072          foreach($additionalParameters as $key => $val)
 073          {
 074              $url->addToQuery($key, $val);
 075          }
 076   
 077          return $url;
 078      }
 079   
 080      /**
 081       * Retrieves and stores/returns the OAuth1 access token after a successful authorization.
 082       *
 083       * @abstract
 084       * @param string $token The request token from the callback.
 085       * @param string $verifier
 086       * @param string $tokenSecret
 087       * @return TokenInterface $token
 088       * @throws TokenResponseException
 089       */
 090      public function requestAccessToken($token, $verifier, $tokenSecret = null)
 091      {
 092          if(is_null($tokenSecret)) {
 093              $storedRequestToken = $this->storage->retrieveAccessToken($this->service());
 094              $tokenSecret = $storedRequestToken->getRequestTokenSecret();
 095          }
 096          $this->signature->setTokenSecret($tokenSecret);
 097   
 098          $extraAuthenticationHeaders = array(
 099              'oauth_token' => $token,
 100          );
 101   
 102          $bodyParams = array(
 103              'oauth_verifier' => $verifier,
 104          );
 105   
 106          $authorizationHeader = array(
 107              'Authorization' =>
 108                  $this->buildAuthorizationHeaderForAPIRequest(
 109                      'POST',
 110                      $this->getAccessTokenEndpoint(),
 111                      $this->storage->retrieveAccessToken($this->service()),
 112                      $bodyParams
 113              )
 114          );
 115   
 116          $headers = array_merge($authorizationHeader, $this->getExtraOAuthHeaders());
 117   
 118          $responseBody = $this->httpClient->retrieveResponse($this->getAccessTokenEndpoint(), $bodyParams, $headers);
 119   
 120          $token = $this->parseAccessTokenResponse($responseBody);
 121          $this->storage->storeAccessToken($this->service(), $token);
 122   
 123          return $token;
 124      }
 125   
 126      /**
 127       * Sends an authenticated API request to the path provided.
 128       * If the path provided is not an absolute URI, the base API Uri (must be passed into constructor) will be used.
 129       * @param $path string|UriInterface
 130       * @param string $method HTTP method
 131       * @param array $body Request body if applicable (key/value pairs)
 132       * @param array $extraHeaders Extra headers if applicable. These will override service-specific any defaults.
 133       * @return string
 134       */
 135      public function request($path, $method = 'GET', $body = null, array $extraHeaders = array())
 136      {
 137          $uri = $this->determineRequestUriFromPath($path, $this->baseApiUri);
 138   
 139          /** @var $token \OAuth\OAuth1\Token\StdOAuth1Token */
 140          $token = $this->storage->retrieveAccessToken($this->service());
 141          $extraHeaders = array_merge( $this->getExtraApiHeaders(), $extraHeaders );
 142          $authorizationHeader = array('Authorization' => $this->buildAuthorizationHeaderForAPIRequest($method, $uri, $token, $body));
 143          $headers = array_merge($authorizationHeader, $extraHeaders);
 144   
 145          return $this->httpClient->retrieveResponse($uri, $body, $headers, $method);
 146      }
 147   
 148      /**
 149       * Return any additional headers always needed for this service implementation's OAuth calls.
 150       *
 151       * @return array
 152       */
 153      protected function getExtraOAuthHeaders()
 154      {
 155          return array();
 156      }
 157   
 158      /**
 159       * Return any additional headers always needed for this service implementation's API calls.
 160       *
 161       * @return array
 162       */
 163      protected function getExtraApiHeaders()
 164      {
 165          return array();
 166      }
 167   
 168      /**
 169       * Builds the authorization header for getting an access or request token.
 170       *
 171       * @param array $extraParameters
 172       * @return string
 173       */
 174      protected function buildAuthorizationHeaderForTokenRequest(array $extraParameters = array())
 175      {
 176          $parameters = $this->getBasicAuthorizationHeaderInfo();
 177          $parameters = array_merge($parameters, $extraParameters);
 178          $parameters['oauth_signature'] = $this->signature->getSignature($this->getRequestTokenEndpoint(), $parameters, 'POST');
 179   
 180          $authorizationHeader = 'OAuth ';
 181          $delimiter = '';
 182          foreach($parameters as $key => $value) {
 183              $authorizationHeader .= $delimiter . rawurlencode($key) . '="' . rawurlencode($value) . '"';
 184   
 185              $delimiter = ', ';
 186          }
 187   
 188          return $authorizationHeader;
 189      }
 190   
 191      /**
 192       * Builds the authorization header for an authenticated API request
 193       * @param string $method
 194       * @param UriInterface $uri the uri the request is headed
 195       * @param \OAuth\OAuth1\Token\TokenInterface $token
 196       * @param $bodyParams Request body if applicable (key/value pairs)
 197       * @return string
 198       */
 199      protected function buildAuthorizationHeaderForAPIRequest($method, UriInterface $uri, TokenInterface $token, $bodyParams = null)
 200      {
 201          $this->signature->setTokenSecret($token->getAccessTokenSecret());
 202          $parameters = $this->getBasicAuthorizationHeaderInfo();
 203          if( isset($parameters['oauth_callback'] ) ){
 204              unset($parameters['oauth_callback']);
 205          }
 206   
 207          $parameters = array_merge($parameters, array('oauth_token' => $token->getAccessToken()) );
 208   
 209          $mergedParams = (is_array($bodyParams)) ? array_merge($parameters, $bodyParams) : $parameters;
 210   
 211          $parameters['oauth_signature'] = $this->signature->getSignature($uri, $mergedParams, $method);
 212   
 213          $authorizationHeader = 'OAuth ';
 214          $delimiter = '';
 215   
 216          foreach($parameters as $key => $value) {
 217              $authorizationHeader .= $delimiter . rawurlencode($key) . '="' . rawurlencode($value) . '"';
 218              $delimiter = ', ';
 219          }
 220   
 221          return $authorizationHeader;
 222      }
 223   
 224      /**
 225       * Builds the authorization header array.
 226       *
 227       * @return array
 228       */
 229      protected function getBasicAuthorizationHeaderInfo()
 230      {
 231          $dateTime = new \DateTime();
 232          $headerParameters = array(
 233              'oauth_callback'         => $this->credentials->getCallbackUrl(),
 234              'oauth_consumer_key'     => $this->credentials->getConsumerId(),
 235              'oauth_nonce'            => $this->generateNonce(),
 236              'oauth_signature_method' => $this->getSignatureMethod(),
 237              'oauth_timestamp'        => $dateTime->format('U'),
 238              'oauth_version'          => $this->getVersion(),
 239          );
 240   
 241          return $headerParameters;
 242      }
 243   
 244      /**
 245       * Pseudo random string generator used to build a unique string to sign each request
 246       *
 247       * @param int $length
 248       * @return string
 249       */
 250      protected function generateNonce($length = 32)
 251      {
 252          $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
 253   
 254          $nonce = '';
 255          $maxRand = strlen($characters)-1;
 256          for($i = 0; $i < $length; $i++) {
 257              $nonce.= $characters[rand(0, $maxRand)];
 258          }
 259   
 260          return $nonce;
 261      }
 262   
 263      /**
 264       * @return string
 265       */
 266      protected function getSignatureMethod()
 267      {
 268          return 'HMAC-SHA1';
 269      }
 270   
 271      /**
 272       * This returns the version used in the authorization header of the requests
 273       *
 274       * @return string
 275       */
 276      protected function getVersion()
 277      {
 278          return '1.0';
 279      }
 280   
 281   
 282      /**
 283       * Parses the request token response and returns a TokenInterface.
 284       *
 285       * @abstract
 286       * @return \OAuth\OAuth1\Token\TokenInterface
 287       * @param string $responseBody
 288       */
 289      abstract protected function parseRequestTokenResponse($responseBody);
 290   
 291      /**
 292       * Parses the access token response and returns a TokenInterface.
 293       *
 294       * @abstract
 295       * @return \OAuth\OAuth1\Token\TokenInterface
 296       * @param string $responseBody
 297       */
 298      abstract protected function parseAccessTokenResponse($responseBody);
 299  }
 300