public function testDefaultCallbackThrowsException() { $options = new ModuleOptions([]); $createUserCallable = $options->getCreateUserCallable(); $this->setExpectedException('ZfrOAuth2\\Server\\Exception\\OAuth2Exception'); $createUserCallable(); }
/** * {@inheritDoc} */ public function createTokenResponse(ServerRequestInterface $request, Client $client = null, TokenOwnerInterface $owner = null) { $postParams = $request->getParsedBody(); $providerName = isset($postParams['provider']) ? $postParams['provider'] : null; $scope = isset($postParams['scope']) ? $postParams['scope'] : null; if ($providerName === null) { throw OAuth2Exception::invalidRequest('Provider name is missing.'); } $provider = $this->providerManager->findByName($providerName); if (!$provider || !$this->providerClients->has($providerName)) { throw OAuth2Exception::invalidRequest(sprintf('Provider %s is not supported', $providerName)); } $providerUser = $this->findProviderUserFromRequest($request, $provider); // access token is valid $userProvider = $this->userProviderManager->findByProviderUid($providerUser->getId(), $provider); if (!$userProvider) { // access token is valid but the user does not exists $createUserCallable = $this->options->getCreateUserCallable(); // by default, we expect the callable to return instance of "Hrevert\OauthClient\Model\UserProviderInterface" // because the developer may have extended the default implementation // Alternatively the callable may return user entity directly $userProvider = $createUserCallable($providerUser); if ($userProvider instanceof UserInterface) { $user = $userProvider; $userProvider = new UserProvider(); $userProvider->setUser($user); } $userProvider->setProviderUid($providerUser->getId()); $userProvider->setProvider($provider); $this->objectManager->persist($userProvider); $this->objectManager->flush(); } /** @var TokenOwnerInterface $owner */ $owner = $userProvider->getUser(); // Everything is okay, we can start tokens generation! $accessToken = new AccessToken(); $this->populateToken($accessToken, $client, $owner, $scope); /** @var AccessToken $accessToken */ $accessToken = $this->accessTokenService->createToken($accessToken); // Before generating a refresh token, we must make sure the authorization server supports this grant $refreshToken = null; if ($this->authorizationServer->hasGrant(RefreshTokenGrant::GRANT_TYPE)) { $refreshToken = new RefreshToken(); $this->populateToken($refreshToken, $client, $owner, $scope); /** @var RefreshToken $refreshToken */ $refreshToken = $this->refreshTokenService->createToken($refreshToken); } return $this->prepareTokenResponse($accessToken, $refreshToken); }