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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
AbstractService.php
001 <?php
002 namespace OAuth\OAuth2\Service;
003
004 use OAuth\Common\Consumer\Credentials;
005 use OAuth\Common\Exception\Exception;
006 use OAuth\Common\Service\AbstractService as BaseAbstractService;
007 use OAuth\Common\Storage\TokenStorageInterface;
008 use OAuth\Common\Http\Exception\TokenResponseException;
009 use OAuth\Common\Http\Client\ClientInterface;
010 use OAuth\Common\Http\Uri\UriInterface;
011 use OAuth\OAuth2\Service\Exception\InvalidScopeException;
012 use OAuth\OAuth2\Service\Exception\MissingRefreshTokenException;
013 use OAuth\Common\Token\TokenInterface;
014 use OAuth\Common\Token\Exception\ExpiredTokenException;
015
016 abstract class AbstractService extends BaseAbstractService implements ServiceInterface
017 {
018
019 /** @const OAUTH_VERSION */
020 const OAUTH_VERSION = 2;
021
022 /** @var array */
023 protected $scopes;
024
025 /** @var \OAuth\Common\Http\Uri\UriInterface|null */
026 protected $baseApiUri;
027
028 /**
029 * @param \OAuth\Common\Consumer\Credentials $credentials
030 * @param \OAuth\Common\Http\Client\ClientInterface $httpClient
031 * @param \OAuth\Common\Storage\TokenStorageInterface $storage
032 * @param array $scopes
033 * @param UriInterface|null $baseApiUri
034 * @throws InvalidScopeException
035 */
036 public function __construct(Credentials $credentials, ClientInterface $httpClient, TokenStorageInterface $storage, $scopes = array(), UriInterface $baseApiUri = null)
037 {
038 parent::__construct($credentials, $httpClient, $storage);
039
040 foreach($scopes as $scope)
041 {
042 if( !$this->isValidScope($scope) ) {
043 throw new InvalidScopeException('Scope ' . $scope . ' is not valid for service ' . get_class($this) );
044 }
045 }
046
047 $this->scopes = $scopes;
048
049 $this->baseApiUri = $baseApiUri;
050 }
051
052 /**
053 * Returns the url to redirect to for authorization purposes.
054 *
055 * @param array $additionalParameters
056 * @return string
057 */
058 public function getAuthorizationUri( array $additionalParameters = array() )
059 {
060 $parameters = array_merge($additionalParameters, array(
061 'type' => 'web_server',
062 'client_id' => $this->credentials->getConsumerId(),
063 'redirect_uri' => $this->credentials->getCallbackUrl(),
064 'response_type' => 'code',
065 ));
066
067 $parameters['scope'] = implode(' ', $this->scopes);
068
069 // Build the url
070 $url = clone $this->getAuthorizationEndpoint();
071 foreach($parameters as $key => $val)
072 {
073 $url->addToQuery($key, $val);
074 }
075
076 return $url;
077 }
078
079
080 /**
081 * Retrieves and stores the OAuth2 access token after a successful authorization.
082 *
083 * @param string $code The access code from the callback.
084 * @return TokenInterface $token
085 * @throws TokenResponseException
086 */
087 public function requestAccessToken($code)
088 {
089 $bodyParams = array(
090 'code' => $code,
091 'client_id' => $this->credentials->getConsumerId(),
092 'client_secret' => $this->credentials->getConsumerSecret(),
093 'redirect_uri' => $this->credentials->getCallbackUrl(),
094 'grant_type' => 'authorization_code',
095 );
096
097 $responseBody = $this->httpClient->retrieveResponse($this->getAccessTokenEndpoint(), $bodyParams, $this->getExtraOAuthHeaders());
098 $token = $this->parseAccessTokenResponse( $responseBody );
099 $this->storage->storeAccessToken($this->service(), $token );
100
101 return $token;
102 }
103
104 /**
105 * Sends an authenticated API request to the path provided.
106 * If the path provided is not an absolute URI, the base API Uri (must be passed into constructor) will be used.
107 *
108 * @param $path string|UriInterface
109 * @param string $method HTTP method
110 * @param array $body Request body if applicable.
111 * @param array $extraHeaders Extra headers if applicable. These will override service-specific any defaults.
112 * @return string
113 * @throws ExpiredTokenException
114 * @throws Exception
115 */
116 public function request($path, $method = 'GET', $body = null, array $extraHeaders = array())
117 {
118 $uri = $this->determineRequestUriFromPath($path, $this->baseApiUri);
119 $token = $this->storage->retrieveAccessToken($this->service());
120
121 if( ( $token->getEndOfLife() !== TokenInterface::EOL_NEVER_EXPIRES ) &&
122 ( $token->getEndOfLife() !== TokenInterface::EOL_UNKNOWN ) &&
123 ( time() > $token->getEndOfLife() ) ) {
124
125 throw new ExpiredTokenException('Token expired on ' . date('m/d/Y', $token->getEndOfLife()) . ' at ' . date('h:i:s A', $token->getEndOfLife()) );
126 }
127
128 // add the token where it may be needed
129 if( static::AUTHORIZATION_METHOD_HEADER_OAUTH === $this->getAuthorizationMethod() ) {
130 $extraHeaders = array_merge( array('Authorization' => 'OAuth ' . $token->getAccessToken()), $extraHeaders );
131 } elseif( static::AUTHORIZATION_METHOD_QUERY_STRING === $this->getAuthorizationMethod() ) {
132 $uri->addToQuery( 'access_token', $token->getAccessToken() );
133 } elseif( static::AUTHORIZATION_METHOD_QUERY_STRING_V2 === $this->getAuthorizationMethod() ) {
134 $uri->addToQuery( 'oauth2_access_token', $token->getAccessToken() );
135 } elseif( static::AUTHORIZATION_METHOD_HEADER_BEARER === $this->getAuthorizationMethod() ) {
136 $extraHeaders = array_merge( array('Authorization' => 'Bearer ' . $token->getAccessToken()), $extraHeaders );
137 }
138
139 $extraHeaders = array_merge( $this->getExtraApiHeaders(), $extraHeaders );
140
141 return $this->httpClient->retrieveResponse($uri, $body, $extraHeaders, $method);
142 }
143
144 /**
145 * Accessor to the storage adapter to be able to retrieve tokens
146 *
147 * @return OAuth\Common\Storage\TokenStorageInterface
148 */
149 public function getStorage()
150 {
151 return $this->storage;
152 }
153
154 /**
155 * Refreshes an OAuth2 access token.
156 *
157 * @param \OAuth\Common\Token\TokenInterface $token
158 * @return \OAuth\Common\Token\TokenInterface $token
159 * @throws \OAuth\OAuth2\Service\Exception\MissingRefreshTokenException
160 */
161 public function refreshAccessToken(TokenInterface $token)
162 {
163 $refreshToken = $token->getRefreshToken();
164
165 if ( empty( $refreshToken ) ) {
166 throw new MissingRefreshTokenException();
167 }
168
169 $parameters = array(
170 'grant_type' => 'refresh_token',
171 'type' => 'web_server',
172 'client_id' => $this->credentials->getConsumerId(),
173 'client_secret' => $this->credentials->getConsumerSecret(),
174 'refresh_token' => $refreshToken,
175 );
176
177 $responseBody = $this->httpClient->retrieveResponse($this->getAccessTokenEndpoint(), $parameters, $this->getExtraOAuthHeaders());
178 $token = $this->parseAccessTokenResponse($responseBody);
179 $this->storage->storeAccessToken($this->service(), $token);
180
181 return $token;
182 }
183
184 /**
185 * Return whether or not the passed scope value is valid.
186 *
187 * @param $scope
188 * @return bool
189 */
190 public function isValidScope($scope)
191 {
192 $reflectionClass = new \ReflectionClass(get_class($this));
193 return in_array( $scope, $reflectionClass->getConstants() );
194 }
195
196 /**
197 * Return any additional headers always needed for this service implementation's OAuth calls.
198 *
199 * @return array
200 */
201 protected function getExtraOAuthHeaders()
202 {
203 return array();
204 }
205
206 /**
207 * Return any additional headers always needed for this service implementation's API calls.
208 *
209 * @return array
210 */
211 protected function getExtraApiHeaders()
212 {
213 return array();
214 }
215
216 /**
217 * Parses the access token response and returns a TokenInterface.
218 *
219 * @abstract
220 * @return \OAuth\Common\Token\TokenInterface
221 * @param string $responseBody
222 */
223 abstract protected function parseAccessTokenResponse($responseBody);
224
225 /**
226 * Returns a class constant from ServiceInterface defining the authorization method used for the API
227 * Header is the sane default.
228 *
229 * @return int
230 */
231 protected function getAuthorizationMethod()
232 {
233 return static::AUTHORIZATION_METHOD_HEADER_OAUTH;
234 }
235 }
236