/** * @dataProvider hasRefreshGrant */ public function testCanCreateTokenResponse($hasRefreshGrant) { $request = $this->createMock(ServerRequestInterface::class); $request->expects($this->once())->method('getParsedBody')->willReturn(['code' => '123', 'client_id' => 'client_123']); $client = Client::reconstitute(['id' => 'client_123', 'name' => 'name', 'secret' => '', 'redirectUris' => []]); $token = $this->getValidAuthorizationCode(null, null, $client); $this->authorizationCodeService->expects($this->once())->method('getToken')->with('123')->will($this->returnValue($token)); $owner = $this->createMock(TokenOwnerInterface::class); $owner->expects($this->once())->method('getTokenOwnerId')->will($this->returnValue(1)); $accessToken = $this->getValidAccessToken($owner); $this->accessTokenService->expects($this->once())->method('createToken')->will($this->returnValue($accessToken)); if ($hasRefreshGrant) { $refreshToken = $this->getValidRefreshToken(); $this->refreshTokenService->expects($this->once())->method('createToken')->will($this->returnValue($refreshToken)); } $authorizationServer = $this->createMock(AuthorizationServer::class); $authorizationServer->expects($this->once())->method('hasGrant')->with(RefreshTokenGrant::GRANT_TYPE)->will($this->returnValue($hasRefreshGrant)); $this->grant = new AuthorizationGrant($this->authorizationCodeService, $this->accessTokenService, $this->refreshTokenService); $this->grant->setAuthorizationServer($authorizationServer); $response = $this->grant->createTokenResponse($request, $client, $owner); $body = json_decode($response->getBody(), true); $this->assertEquals('azerty_access', $body['access_token']); $this->assertEquals('Bearer', $body['token_type']); $this->assertEquals(3600, $body['expires_in']); $this->assertEquals('read', $body['scope']); $this->assertEquals(1, $body['owner_id']); if ($hasRefreshGrant) { $this->assertEquals('azerty_refresh', $body['refresh_token']); } }
/** * {@inheritDoc} * @throws OAuth2Exception */ public function createTokenResponse(ServerRequestInterface $request, Client $client = null, TokenOwnerInterface $owner = null) : ResponseInterface { $postParams = $request->getParsedBody(); $code = $postParams['code'] ?? null; if (null === $code) { throw OAuth2Exception::invalidRequest('Could not find the authorization code in the request'); } /* @var \ZfrOAuth2\Server\Model\AuthorizationCode $authorizationCode */ $authorizationCode = $this->authorizationCodeService->getToken($code); if (null === $authorizationCode || $authorizationCode->isExpired()) { throw OAuth2Exception::invalidGrant('Authorization code cannot be found or is expired'); } $clientId = $postParams['client_id'] ?? null; if ($authorizationCode->getClient()->getId() !== $clientId) { throw OAuth2Exception::invalidRequest('Authorization code\'s client does not match with the one that created the authorization code'); } // If owner is null, we reuse the same as the authorization code $owner = $owner ?: $authorizationCode->getOwner(); // Everything is okey, let's start the token generation! $scopes = $authorizationCode->getScopes(); // reuse the scopes from the authorization code $accessToken = $this->accessTokenService->createToken($owner, $client, $scopes); // 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 = $this->refreshTokenService->createToken($owner, $client, $scopes); } return $this->prepareTokenResponse($accessToken, $refreshToken); }
public function testCreateNewTokenUntilOneDoesNotExist() { $this->scopeService->expects($this->once())->method('getDefaultScopes')->will($this->returnValue(['read'])); $this->tokenRepository->expects($this->at(0))->method('tokenExists')->with($this->isType('string'))->willReturn(true); $this->tokenRepository->expects($this->at(1))->method('tokenExists')->with($this->isType('string'))->willReturn(false); $this->tokenRepository->expects($this->once())->method('save')->will($this->returnArgument(0)); $owner = $this->createMock(TokenOwnerInterface::class); $client = $this->createMock(Client::class); $token = $this->tokenService->createToken('http://www.example.com', $owner, $client, []); $this->assertEquals(40, strlen($token->getToken())); }