/**
  * Gets redirect uri (used in redirecting back to client)
  *
  * @return string
  */
 public function getRedirectUri()
 {
     $scopes = array_map(function (IScope $scope) {
         return $scope->getId();
     }, $this->accessToken->getScopes());
     $query = ['access_token' => $this->accessToken->getId(), 'expires_in' => $this->accessToken->getExpiresAt() - time(), 'token_type' => $this->tokenTypeName, 'scope' => join(' ', $scopes)];
     if ($this->state) {
         $query['state'] = $this->state;
     }
     ksort($query);
     // sort query params by key
     return $this->redirectUri . '#' . http_build_query($query);
 }
 function it_issues_refresh_token_for_given_access_token(IRefreshTokenStorage $refreshTokenStorage, IAccessToken $accessToken, IRefreshToken $refreshToken, IUser $user, IClient $client, IScope $scope)
 {
     $accessToken->getUser()->willReturn($user)->shouldBeCalled();
     $accessToken->getClient()->willReturn($client)->shouldBeCalled();
     $accessToken->getScopes()->willReturn([$scope])->shouldBeCalled();
     $refreshTokenStorage->generate($user, $client, [$scope])->willReturn($refreshToken)->shouldBeCalled();
     $this->issueToken($accessToken)->shouldReturnAnInstanceOf('OAuth2\\Storage\\IRefreshToken');
 }
 /**
  * Issues refresh token for given access token
  *
  * @param IAccessToken $accessToken
  *
  * @return \OAuth2\Storage\IRefreshToken
  */
 public function issueToken(IAccessToken $accessToken)
 {
     $scopes = $accessToken->getScopes();
     // in case of doctrine collections, etc
     if ($scopes instanceof \Traversable) {
         $scopes = iterator_to_array($scopes);
     }
     return $this->refreshTokenStorage->generate($accessToken->getUser(), $accessToken->getClient(), $scopes);
 }
 function it_should_return_scopes_from_access_token(IAccessToken $accessToken)
 {
     $accessToken->getScopes()->willReturn([])->shouldBeCalled();
     $this->getScopes()->shouldReturn([]);
 }