Вход Регистрация
Файл: vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/AbstractService.php
Строк: 398
<?php
namespace OAuthOAuth1Service;

use 
OAuthCommonConsumerCredentials;
use 
OAuthCommonStorageTokenStorageInterface;
use 
OAuthCommonHttpExceptionTokenResponseException;
use 
OAuthCommonHttpClientClientInterface;
use 
OAuthCommonHttpUriUriInterface;
use 
OAuthOAuth1SignatureSignatureInterface;
use 
OAuthOAuth1TokenTokenInterface;
use 
OAuthOAuth1TokenStdOAuth1Token;
use 
OAuthCommonServiceAbstractService as BaseAbstractService;

abstract class 
AbstractService extends BaseAbstractService implements ServiceInterface
{

    
/** @const OAUTH_VERSION */
    
const OAUTH_VERSION 1;

    
/** @var OAuthOAuth1SignatureSignatureInterface */
    
protected $signature;

    
/** @var OAuthCommonHttpUriUriInterface|null */
    
protected $baseApiUri;

    
/**
     * @param OAuthCommonConsumerCredentials $credentials
     * @param OAuthCommonHttpClientClientInterface $httpClient
     * @param OAuthCommonStorageTokenStorageInterface $storage
     * @param OAuthOAuth1SignatureSignatureInterface $signature
     * @param UriInterface|null $baseApiUri
     */
    
public function __construct(Credentials $credentialsClientInterface $httpClientTokenStorageInterface $storageSignatureInterface $signatureUriInterface $baseApiUri null)
    {
        
parent::__construct($credentials$httpClient$storage);

        
$this->signature    $signature;
        
$this->baseApiUri   $baseApiUri;

        
$this->signature->setHashingAlgorithm($this->getSignatureMethod());
    }

    
/**
     * Retrieves and stores the OAuth1 request token obtained from the service.
     *
     * @return TokenInterface $token
     * @throws TokenResponseException
     */
    
public function requestRequestToken()
    {
        
$authorizationHeader = array('Authorization' => $this->buildAuthorizationHeaderForTokenRequest());
        
$headers array_merge($authorizationHeader$this->getExtraOAuthHeaders());

        
$responseBody $this->httpClient->retrieveResponse($this->getRequestTokenEndpoint(), array(), $headers);

        
$token $this->parseRequestTokenResponse($responseBody);
        
$this->storage->storeAccessToken($this->service(), $token);

        return 
$token;
    }

    
/**
     * Returns the url to redirect to for authorization purposes.
     *
     * @param array $additionalParameters
     * @return string
     */
    
public function getAuthorizationUri( array $additionalParameters = array() )
    {
        
// Build the url
        
$url = clone $this->getAuthorizationEndpoint();
        foreach(
$additionalParameters as $key => $val)
        {
            
$url->addToQuery($key$val);
        }

        return 
$url;
    }

    
/**
     * Retrieves and stores/returns the OAuth1 access token after a successful authorization.
     *
     * @abstract
     * @param string $token The request token from the callback.
     * @param string $verifier
     * @param string $tokenSecret
     * @return TokenInterface $token
     * @throws TokenResponseException
     */
    
public function requestAccessToken($token$verifier$tokenSecret null)
    {
        if(
is_null($tokenSecret)) {
            
$storedRequestToken $this->storage->retrieveAccessToken($this->service());
            
$tokenSecret $storedRequestToken->getRequestTokenSecret();
        }
        
$this->signature->setTokenSecret($tokenSecret);

        
$extraAuthenticationHeaders = array(
            
'oauth_token' => $token,
        );

        
$bodyParams = array(
            
'oauth_verifier' => $verifier,
        );

        
$authorizationHeader = array(
            
'Authorization' =>
                
$this->buildAuthorizationHeaderForAPIRequest(
                    
'POST',
                    
$this->getAccessTokenEndpoint(),
                    
$this->storage->retrieveAccessToken($this->service()),
                    
$bodyParams
            
)
        );

        
$headers array_merge($authorizationHeader$this->getExtraOAuthHeaders());

        
$responseBody $this->httpClient->retrieveResponse($this->getAccessTokenEndpoint(), $bodyParams$headers);

        
$token $this->parseAccessTokenResponse($responseBody);
        
$this->storage->storeAccessToken($this->service(), $token);

        return 
$token;
    }

    
/**
     * Sends an authenticated API request to the path provided.
     * If the path provided is not an absolute URI, the base API Uri (must be passed into constructor) will be used.
     * @param $path string|UriInterface
     * @param string $method HTTP method
     * @param array $body Request body if applicable (key/value pairs)
     * @param array $extraHeaders Extra headers if applicable. These will override service-specific any defaults.
     * @return string
     */
    
public function request($path$method 'GET'$body null, array $extraHeaders = array())
    {
        
$uri $this->determineRequestUriFromPath($path$this->baseApiUri);

        
/** @var $token OAuthOAuth1TokenStdOAuth1Token */
        
$token $this->storage->retrieveAccessToken($this->service());
        
$extraHeaders array_merge$this->getExtraApiHeaders(), $extraHeaders );
        
$authorizationHeader = array('Authorization' => $this->buildAuthorizationHeaderForAPIRequest($method$uri$token$body));
        
$headers array_merge($authorizationHeader$extraHeaders);

        return 
$this->httpClient->retrieveResponse($uri$body$headers$method);
    }

    
/**
     * Return any additional headers always needed for this service implementation's OAuth calls.
     *
     * @return array
     */
    
protected function getExtraOAuthHeaders()
    {
        return array();
    }

    
/**
     * Return any additional headers always needed for this service implementation's API calls.
     *
     * @return array
     */
    
protected function getExtraApiHeaders()
    {
        return array();
    }

    
/**
     * Builds the authorization header for getting an access or request token.
     *
     * @param array $extraParameters
     * @return string
     */
    
protected function buildAuthorizationHeaderForTokenRequest(array $extraParameters = array())
    {
        
$parameters $this->getBasicAuthorizationHeaderInfo();
        
$parameters array_merge($parameters$extraParameters);
        
$parameters['oauth_signature'] = $this->signature->getSignature($this->getRequestTokenEndpoint(), $parameters'POST');

        
$authorizationHeader 'OAuth ';
        
$delimiter '';
        foreach(
$parameters as $key => $value) {
            
$authorizationHeader .= $delimiter rawurlencode($key) . '="' rawurlencode($value) . '"';

            
$delimiter ', ';
        }

        return 
$authorizationHeader;
    }

    
/**
     * Builds the authorization header for an authenticated API request
     * @param string $method
     * @param UriInterface $uri the uri the request is headed
     * @param OAuthOAuth1TokenTokenInterface $token
     * @param $bodyParams Request body if applicable (key/value pairs)
     * @return string
     */
    
protected function buildAuthorizationHeaderForAPIRequest($methodUriInterface $uriTokenInterface $token$bodyParams null)
    {
        
$this->signature->setTokenSecret($token->getAccessTokenSecret());
        
$parameters $this->getBasicAuthorizationHeaderInfo();
        if( isset(
$parameters['oauth_callback'] ) ){
            unset(
$parameters['oauth_callback']);
        }

        
$parameters array_merge($parameters, array('oauth_token' => $token->getAccessToken()) );

        
$mergedParams = (is_array($bodyParams)) ? array_merge($parameters$bodyParams) : $parameters;

        
$parameters['oauth_signature'] = $this->signature->getSignature($uri$mergedParams$method);

        
$authorizationHeader 'OAuth ';
        
$delimiter '';

        foreach(
$parameters as $key => $value) {
            
$authorizationHeader .= $delimiter rawurlencode($key) . '="' rawurlencode($value) . '"';
            
$delimiter ', ';
        }

        return 
$authorizationHeader;
    }

    
/**
     * Builds the authorization header array.
     *
     * @return array
     */
    
protected function getBasicAuthorizationHeaderInfo()
    {
        
$dateTime = new DateTime();
        
$headerParameters = array(
            
'oauth_callback'         => $this->credentials->getCallbackUrl(),
            
'oauth_consumer_key'     => $this->credentials->getConsumerId(),
            
'oauth_nonce'            => $this->generateNonce(),
            
'oauth_signature_method' => $this->getSignatureMethod(),
            
'oauth_timestamp'        => $dateTime->format('U'),
            
'oauth_version'          => $this->getVersion(),
        );

        return 
$headerParameters;
    }

    
/**
     * Pseudo random string generator used to build a unique string to sign each request
     *
     * @param int $length
     * @return string
     */
    
protected function generateNonce($length 32)
    {
        
$characters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';

        
$nonce '';
        
$maxRand strlen($characters)-1;
        for(
$i 0$i $length$i++) {
            
$nonce.= $characters[rand(0$maxRand)];
        }

        return 
$nonce;
    }

    
/**
     * @return string
     */
    
protected function getSignatureMethod()
    {
        return 
'HMAC-SHA1';
    }

    
/**
     * This returns the version used in the authorization header of the requests
     *
     * @return string
     */
    
protected function getVersion()
    {
        return 
'1.0';
    }


    
/**
     * Parses the request token response and returns a TokenInterface.
     *
     * @abstract
     * @return OAuthOAuth1TokenTokenInterface
     * @param string $responseBody
     */
    
abstract protected function parseRequestTokenResponse($responseBody);

    
/**
     * Parses the access token response and returns a TokenInterface.
     *
     * @abstract
     * @return OAuthOAuth1TokenTokenInterface
     * @param string $responseBody
     */
    
abstract protected function parseAccessTokenResponse($responseBody);
}
Онлайн: 2
Реклама