19 private $redirect_uri;
20 private $response_type;
46 $this->config = array_merge(array(
47 'allow_implicit' =>
false,
48 'enforce_state' =>
true,
49 'require_exact_redirect_uri' =>
true,
50 'redirect_status_code' => 302,
61 if (!is_bool($is_authorized)) {
62 throw new \InvalidArgumentException(
'Argument "is_authorized" must be a boolean. This method must know if the user has granted access to the client.');
72 if (
empty($this->redirect_uri)) {
73 $clientData = $this->clientStorage->getClientDetails($this->client_id);
74 $registered_redirect_uri = $clientData[
'redirect_uri'];
78 if ($is_authorized ===
false) {
79 $redirect_uri = $this->redirect_uri ?: $registered_redirect_uri;
90 $authResult = $this->responseTypes[$this->response_type]->getAuthorizeResponse($params, $user_id);
92 list($redirect_uri, $uri_params) = $authResult;
94 if (
empty($redirect_uri) && !
empty($registered_redirect_uri)) {
95 $redirect_uri = $registered_redirect_uri;
98 $uri = $this->buildUri($redirect_uri, $uri_params);
101 $response->
setRedirect($this->config[
'redirect_status_code'], $uri);
106 $error =
'access_denied';
107 $error_message =
'The user denied access to your application';
108 $response->
setRedirect($this->config[
'redirect_status_code'], $redirect_uri, $this->state, $error, $error_message);
119 'scope' => $this->scope,
120 'state' => $this->state,
121 'client_id' => $this->client_id,
122 'redirect_uri' => $this->redirect_uri,
123 'response_type' => $this->response_type,
132 if (!$client_id = $request->
query(
'client_id', $request->
request(
'client_id'))) {
134 $response->
setError(400,
'invalid_client',
"No client id supplied");
140 if (!$clientData = $this->clientStorage->getClientDetails($client_id)) {
141 $response->
setError(400,
'invalid_client',
'The client id supplied is invalid');
146 $registered_redirect_uri = isset($clientData[
'redirect_uri']) ? $clientData[
'redirect_uri'] :
'';
152 if ($supplied_redirect_uri = $request->
query(
'redirect_uri', $request->
request(
'redirect_uri'))) {
154 $parts = parse_url($supplied_redirect_uri);
155 if (isset($parts[
'fragment']) && $parts[
'fragment']) {
156 $response->
setError(400,
'invalid_uri',
'The redirect URI must not contain a fragment');
162 if ($registered_redirect_uri && !$this->
validateRedirectUri($supplied_redirect_uri, $registered_redirect_uri)) {
163 $response->
setError(400,
'redirect_uri_mismatch',
'The redirect URI provided is missing or does not match',
'#section-3.1.2');
167 $redirect_uri = $supplied_redirect_uri;
170 if (!$registered_redirect_uri) {
171 $response->
setError(400,
'invalid_uri',
'No redirect URI was supplied or stored');
176 if (count(explode(
' ', $registered_redirect_uri)) > 1) {
177 $response->
setError(400,
'invalid_uri',
'A redirect URI must be supplied when multiple redirect URIs are registered',
'#section-3.1.2.3');
181 $redirect_uri = $registered_redirect_uri;
185 $response_type = $request->
query(
'response_type', $request->
request(
'response_type'));
188 if (
false !== strpos($response_type,
' ')) {
189 $types = explode(
' ', $response_type);
191 $response_type = ltrim(implode(
' ', $types));
194 $state = $request->
query(
'state', $request->
request(
'state'));
198 $response->
setRedirect($this->config[
'redirect_status_code'], $redirect_uri, $state,
'invalid_request',
'Invalid or missing response type',
null);
203 if ($response_type == self::RESPONSE_TYPE_AUTHORIZATION_CODE) {
204 if (!isset($this->responseTypes[
'code'])) {
205 $response->
setRedirect($this->config[
'redirect_status_code'], $redirect_uri, $state,
'unsupported_response_type',
'authorization code grant type not supported',
null);
209 if (!$this->clientStorage->checkRestrictedGrantType($client_id,
'authorization_code')) {
210 $response->
setRedirect($this->config[
'redirect_status_code'], $redirect_uri, $state,
'unauthorized_client',
'The grant type is unauthorized for this client_id',
null);
214 if ($this->responseTypes[
'code']->enforceRedirect() && !$redirect_uri) {
215 $response->
setError(400,
'redirect_uri_mismatch',
'The redirect URI is mandatory and was not supplied');
220 if (!$this->config[
'allow_implicit']) {
221 $response->
setRedirect($this->config[
'redirect_status_code'], $redirect_uri, $state,
'unsupported_response_type',
'implicit grant type not supported',
null);
225 if (!$this->clientStorage->checkRestrictedGrantType($client_id,
'implicit')) {
226 $response->
setRedirect($this->config[
'redirect_status_code'], $redirect_uri, $state,
'unauthorized_client',
'The grant type is unauthorized for this client_id',
null);
233 $requestedScope = $this->scopeUtil->getScopeFromRequest($request);
235 if ($requestedScope) {
238 $clientScope = $this->clientStorage->getClientScope($client_id);
239 if ((is_null($clientScope) && !$this->scopeUtil->scopeExists($requestedScope))
240 || ($clientScope && !$this->scopeUtil->checkScope($requestedScope, $clientScope))) {
241 $response->
setRedirect($this->config[
'redirect_status_code'], $redirect_uri, $state,
'invalid_scope',
'An unsupported scope was requested',
null);
247 $defaultScope = $this->scopeUtil->getDefaultScope($client_id);
249 if (
false === $defaultScope) {
250 $response->
setRedirect($this->config[
'redirect_status_code'], $redirect_uri, $state,
'invalid_client',
'This application requires you specify a scope parameter',
null);
255 $requestedScope = $defaultScope;
259 if ($this->config[
'enforce_state'] && !$state) {
260 $response->
setRedirect($this->config[
'redirect_status_code'], $redirect_uri,
null,
'invalid_request',
'The state parameter is required');
266 $this->scope = $requestedScope;
267 $this->state = $state;
268 $this->client_id = $client_id;
270 $this->redirect_uri = $supplied_redirect_uri;
271 $this->response_type = $response_type;
287 private function buildUri($uri, $params)
289 $parse_url = parse_url($uri);
292 foreach ($params
as $k => $v) {
293 if (isset($parse_url[$k])) {
294 $parse_url[$k] .=
"&" . http_build_query($v,
'',
'&');
296 $parse_url[$k] = http_build_query($v,
'',
'&');
302 ((isset($parse_url[
"scheme"])) ? $parse_url[
"scheme"] .
"://" :
"")
303 . ((isset($parse_url[
"user"])) ? $parse_url[
"user"]
304 . ((isset($parse_url[
"pass"])) ?
":" . $parse_url[
"pass"] :
"") .
"@" :
"")
305 . ((isset($parse_url[
"host"])) ? $parse_url[
"host"] :
"")
306 . ((isset($parse_url[
"port"])) ?
":" . $parse_url[
"port"] :
"")
307 . ((isset($parse_url[
"path"])) ? $parse_url[
"path"] :
"")
308 . ((isset($parse_url[
"query"]) && !
empty($parse_url[
'query'])) ?
"?" . $parse_url[
"query"] :
"")
309 . ((isset($parse_url[
"fragment"])) ?
"#" . $parse_url[
"fragment"] :
"")
316 self::RESPONSE_TYPE_ACCESS_TOKEN,
317 self::RESPONSE_TYPE_AUTHORIZATION_CODE,
332 if (!$inputUri || !$registeredUriString) {
336 $registered_uris = preg_split(
'/\s+/', $registeredUriString);
337 foreach ($registered_uris
as $registered_uri) {
338 if ($this->config[
'require_exact_redirect_uri']) {
340 if (strcmp($inputUri, $registered_uri) === 0) {
346 if (strcasecmp(substr($inputUri, 0, strlen($registered_uri)), $registered_uri) === 0) {
371 return $this->client_id;
376 return $this->redirect_uri;
381 return $this->response_type;