예제 #1
0
 /**
  * Get a client.
  *
  * @param string $clientIdentifier The client's identifier
  * @param string $grantType The grant type used
  * @param string $clientSecret The client's secret (if sent)
  *
  * @return \League\OAuth2\Server\Entities\Interfaces\ClientEntityInterface
  **/
 public function getClientEntity($clientIdentifier, $grantType, $clientSecret = null, $mustValidateSecret = true)
 {
     $builder = (new Builder())->columns(['Client.id', 'Client.secret', 'Client.name'])->addFrom(\Ivyhjk\OAuth2\Server\Adapter\Phalcon\Model\Client::class, 'Client')->where('Client.id = :clientIdentifier:', compact('clientIdentifier'))->limit(1);
     if ($mustValidateSecret === true) {
         $builder->andWhere('Client.secret = :clientSecret:', compact('clientSecret'));
     }
     //
     if ($this->getConfig()->limit_clients_to_grants === true) {
         $builder->innerJoin(\Ivyhjk\OAuth2\Server\Adapter\Phalcon\Model\ClientGrant::class, 'ClientGrant.client_id = Client.id', 'ClientGrant')->innerJoin(\Ivyhjk\OAuth2\Server\Adapter\Phalcon\Model\Grant::class, 'Grant.id = ClientGrant.grant_id', 'Grant')->andWhere('Grant.id = :grantType:', compact('grantType'));
     }
     $query = $builder->getQuery();
     $result = $query->getSingleResult();
     if (!$result) {
         throw OAuthServerException::invalidClient();
     }
     // Get one endpoint?
     // $builder = $this->getDatabase()->createBuilder();
     //
     // $builder
     //     ->columns([
     //         'ClientEndpoint.redirect_uri'
     //     ])
     //     ->addFrom(\Ivyhjk\OAuth2\Server\Adapter\Phalcon\Model\ClientEndpoint::class, 'ClientEndpoint')
     //     ->where('ClientEndpoint.client_id = :client_id:', [
     //         'client_id' => $result->id
     //     ])
     //     ->limit(1);
     //
     // $endpoint = $builder->getQuery()->getSingleResult();
     $client = new ClientEntity();
     $client->setName($result->name);
     $client->setIdentifier($result->id);
     // if ($endpoint) {
     //     $client->setRedirectUri($endpoint->redirect_uri);
     // }
     return $client;
 }
예제 #2
0
 /**
  * Validate the client.
  *
  * @param \lcon\Http\RequestInterface $request
  *
  * @throws \League\OAuth2\Server\Exception\OAuthServerException
  *
  * @return \League\OAuth2\Server\Entities\ClientEntityInterface
  */
 protected function validateClient(\Phalcon\Http\RequestInterface $request)
 {
     $clientId = $this->getRequestParameter('client_id', $request, $this->getServerParameter('PHP_AUTH_USER', $request));
     if (is_null($clientId)) {
         throw OAuthServerException::invalidRequest('client_id');
     }
     // If the client is confidential require the client secret
     $clientSecret = $this->getRequestParameter('client_secret', $request, $this->getServerParameter('PHP_AUTH_PW', $request));
     $client = $this->clientRepository->getClientEntity($clientId, $this->getIdentifier(), $clientSecret, true);
     if (!$client instanceof ClientEntityInterface) {
         $this->getEmitter()->emit(new RequestEvent('client.authentication.failed', $request));
         throw OAuthServerException::invalidClient();
     }
     // If a redirect URI is provided ensure it matches what is pre-registered
     $redirectUri = $this->getRequestParameter('redirect_uri', $request, null);
     if ($redirectUri !== null) {
         if (is_string($client->getRedirectUri()) && strcmp($client->getRedirectUri(), $redirectUri) !== 0) {
             $this->getEmitter()->emit(new RequestEvent('client.authentication.failed', $request));
             throw OAuthServerException::invalidClient();
         } elseif (is_array($client->getRedirectUri()) && in_array($redirectUri, $client->getRedirectUri()) === false) {
             $this->getEmitter()->emit(new RequestEvent('client.authentication.failed', $request));
             throw OAuthServerException::invalidClient();
         }
     }
     return $client;
 }
 /**
  * {@inheritdoc}
  */
 public function validateAuthorizationRequest(ServerRequestInterface $request)
 {
     $clientId = $this->getQueryStringParameter('client_id', $request, $this->getServerParameter('PHP_AUTH_USER', $request));
     if (is_null($clientId)) {
         throw OAuthServerException::invalidRequest('client_id');
     }
     $client = $this->clientRepository->getClientEntity($clientId, $this->getIdentifier(), null, false);
     if ($client instanceof ClientEntityInterface === false) {
         $this->getEmitter()->emit(new RequestEvent(RequestEvent::CLIENT_AUTHENTICATION_FAILED, $request));
         throw OAuthServerException::invalidClient();
     }
     $redirectUri = $this->getQueryStringParameter('redirect_uri', $request);
     if ($redirectUri !== null) {
         if (is_string($client->getRedirectUri()) && strcmp($client->getRedirectUri(), $redirectUri) !== 0) {
             $this->getEmitter()->emit(new RequestEvent(RequestEvent::CLIENT_AUTHENTICATION_FAILED, $request));
             throw OAuthServerException::invalidClient();
         } elseif (is_array($client->getRedirectUri()) && in_array($redirectUri, $client->getRedirectUri()) === false) {
             $this->getEmitter()->emit(new RequestEvent(RequestEvent::CLIENT_AUTHENTICATION_FAILED, $request));
             throw OAuthServerException::invalidClient();
         }
     }
     $scopes = $this->validateScopes($this->getQueryStringParameter('scope', $request), is_array($client->getRedirectUri()) ? $client->getRedirectUri()[0] : $client->getRedirectUri());
     $stateParameter = $this->getQueryStringParameter('state', $request);
     $authorizationRequest = new AuthorizationRequest();
     $authorizationRequest->setGrantTypeId($this->getIdentifier());
     $authorizationRequest->setClient($client);
     $authorizationRequest->setRedirectUri($redirectUri);
     $authorizationRequest->setState($stateParameter);
     $authorizationRequest->setScopes($scopes);
     if ($this->enableCodeExchangeProof === true) {
         $codeChallenge = $this->getQueryStringParameter('code_challenge', $request);
         if ($codeChallenge === null) {
             throw OAuthServerException::invalidRequest('code_challenge');
         }
         $codeChallengeMethod = $this->getQueryStringParameter('code_challenge_method', $request, 'plain');
         if (in_array($codeChallengeMethod, ['plain', 'S256']) === false) {
             throw OAuthServerException::invalidRequest('code_challenge_method', 'Code challenge method must be `plain` or `S256`');
         }
         $authorizationRequest->setCodeChallenge($codeChallenge);
         $authorizationRequest->setCodeChallengeMethod($codeChallengeMethod);
     }
     return $authorizationRequest;
 }
예제 #4
0
 /**
  * {@inheritdoc}
  */
 public function validateAuthorizationRequest(ServerRequestInterface $request)
 {
     $clientId = $this->getQueryStringParameter('client_id', $request, $this->getServerParameter('PHP_AUTH_USER', $request));
     if (is_null($clientId)) {
         throw OAuthServerException::invalidRequest('client_id');
     }
     $client = $this->clientRepository->getClientEntity($clientId, $this->getIdentifier(), null, false);
     if ($client instanceof ClientEntityInterface === false) {
         $this->getEmitter()->emit(new RequestEvent(RequestEvent::CLIENT_AUTHENTICATION_FAILED, $request));
         throw OAuthServerException::invalidClient();
     }
     $redirectUri = $this->getQueryStringParameter('redirect_uri', $request);
     if ($redirectUri !== null) {
         if (is_string($client->getRedirectUri()) && strcmp($client->getRedirectUri(), $redirectUri) !== 0) {
             $this->getEmitter()->emit(new RequestEvent(RequestEvent::CLIENT_AUTHENTICATION_FAILED, $request));
             throw OAuthServerException::invalidClient();
         } elseif (is_array($client->getRedirectUri()) && in_array($redirectUri, $client->getRedirectUri()) === false) {
             $this->getEmitter()->emit(new RequestEvent(RequestEvent::CLIENT_AUTHENTICATION_FAILED, $request));
             throw OAuthServerException::invalidClient();
         }
     }
     $scopes = $this->validateScopes($this->getQueryStringParameter('scope', $request), is_array($client->getRedirectUri()) ? $client->getRedirectUri()[0] : $client->getRedirectUri());
     // Finalize the requested scopes
     $scopes = $this->scopeRepository->finalizeScopes($scopes, $this->getIdentifier(), $client);
     $stateParameter = $this->getQueryStringParameter('state', $request);
     $authorizationRequest = new AuthorizationRequest();
     $authorizationRequest->setGrantTypeId($this->getIdentifier());
     $authorizationRequest->setClient($client);
     $authorizationRequest->setRedirectUri($redirectUri);
     $authorizationRequest->setState($stateParameter);
     $authorizationRequest->setScopes($scopes);
     return $authorizationRequest;
 }
 /**
  * Validate the client.
  *
  * @param \Psr\Http\Message\ServerRequestInterface $request
  *
  * @throws \League\OAuth2\Server\Exception\OAuthServerException
  *
  * @return \League\OAuth2\Server\Entities\ClientEntityInterface
  */
 protected function validateClient(ServerRequestInterface $request)
 {
     list($basicAuthUser, $basicAuthPassword) = $this->getBasicAuthCredentials($request);
     $clientId = $this->getRequestParameter('client_id', $request, $basicAuthUser);
     if (is_null($clientId)) {
         throw OAuthServerException::invalidRequest('client_id');
     }
     // If the client is confidential require the client secret
     $clientSecret = $this->getRequestParameter('client_secret', $request, $basicAuthPassword);
     $client = $this->clientRepository->getClientEntity($clientId, $this->getIdentifier(), $clientSecret, true);
     if (!$client instanceof ClientEntityInterface) {
         $this->getEmitter()->emit(new RequestEvent(RequestEvent::CLIENT_AUTHENTICATION_FAILED, $request));
         throw OAuthServerException::invalidClient();
     }
     // If a redirect URI is provided ensure it matches what is pre-registered
     $redirectUri = $this->getRequestParameter('redirect_uri', $request, null);
     if ($redirectUri !== null) {
         if (is_string($client->getRedirectUri()) && strcmp($client->getRedirectUri(), $redirectUri) !== 0) {
             $this->getEmitter()->emit(new RequestEvent(RequestEvent::CLIENT_AUTHENTICATION_FAILED, $request));
             throw OAuthServerException::invalidClient();
         } elseif (is_array($client->getRedirectUri()) && in_array($redirectUri, $client->getRedirectUri()) === false) {
             $this->getEmitter()->emit(new RequestEvent(RequestEvent::CLIENT_AUTHENTICATION_FAILED, $request));
             throw OAuthServerException::invalidClient();
         }
     }
     return $client;
 }