Skip to content

Commit

Permalink
Added new Oauth2Response
Browse files Browse the repository at this point in the history
  • Loading branch information
f3l1x committed Dec 20, 2020
1 parent f2660c4 commit 6ce09a5
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 10 deletions.
24 changes: 14 additions & 10 deletions .docs/README.md
Expand Up @@ -18,11 +18,12 @@ Please take a look at official documentation: [https://oauth2.thephpleague.com/]
composer require contributte/oauth2-server
```

You also need to generate public and private key and an encryption key, for more information how to do it check out `League/OAuth2Server` documentation: https://oauth2.thephpleague.com/installation/.
You also need to generate public and private key and an encryption key, for more information how to do it check
out `League/OAuth2Server` documentation: https://oauth2.thephpleague.com/installation/.

```yaml
extensions:
oauth2.server: Contributte\OAuth2Server\DI\OAuth2ServerExtension
oauth2.server: Contributte\OAuth2Server\DI\OAuth2ServerExtension
```

## Configuration
Expand Down Expand Up @@ -50,6 +51,7 @@ oauth2.server:
```

For encryption key, you can use `Defuse\Crypt\Key::loadFromAsciiSafeString($string)` or key in a string form.

```yaml
oauth2.server:
encryptionKey: Defuse\Crypto\Key::loadFromAsciiSafeString('keyInStringForm')
Expand All @@ -58,8 +60,9 @@ oauth2.server:

Do not forget to register repositories as a services!

For more information about The PHP League's OAuth2 server, check out it's [documentation](https://oauth2.thephpleague.com/). This package provides tiny wrappaper and integration into Nette framework.

For more information about The PHP League's OAuth2 server, check out
it's [documentation](https://oauth2.thephpleague.com/). This package provides tiny wrappaper and integration into Nette
framework.

## Example

Expand All @@ -68,14 +71,16 @@ For more information about The PHP League's OAuth2 server, check out it's [docum

namespace App\Presenters;

use Contributte\Psr7\Psr7Response;
use Contributte\OAuth2Server\Http\Oauth2Response;
use Contributte\Psr7\Psr7ResponseFactory;
use Contributte\Psr7\Psr7ServerRequestFactory;
use Contributte\Psr7\Psr7Stream;
use GuzzleHttp\Psr7\Utils;
use League\OAuth2\Server\AuthorizationServer;
use League\OAuth2\Server\Exception\OAuthServerException;
use Nette\Application\UI\Presenter;
use Nette\Http\IResponse;
use Nette\Http\IRequest;
use Throwable;

class OAuth2Presenter extends Presenter
{
Expand All @@ -96,14 +101,13 @@ class OAuth2Presenter extends Presenter
$reply = $this->authorizationServer->respondToAccessTokenRequest($psr7Request, $psr7Response);
} catch (OAuthServerException $exception) {
$reply = $exception->generateHttpResponse($psr7Response);
} catch (Exception $exception) {
$body = new Psr7Stream('php://temp');
} catch (Throwable $exception) {
$body = Utils::streamFor('php://temp');
$body->write($exception->getMessage());
$reply = $psr7Response->withStatus(500)->withBody($body);
}

$sendResponse = Psr7Response::of($reply);
$this->sendResponse($sendResponse->getApplicationResponse());
$this->sendResponse(new Oauth2Response($reply));
}

}
Expand Down
1 change: 1 addition & 0 deletions composer.json
Expand Up @@ -17,6 +17,7 @@
},
"require-dev": {
"contributte/psr7-http-message": "^0.7",
"nette/application": "^3.0.6",
"ninjify/nunjuck": "^0.4",
"ninjify/qa": "^0.12",
"phpstan/phpstan": "^0.12",
Expand Down
39 changes: 39 additions & 0 deletions src/Http/Oauth2Response.php
@@ -0,0 +1,39 @@
<?php declare(strict_types = 1);

namespace Contributte\OAuth2Server\Http;

use Nette\Application\IResponse as AppResponse;
use Nette\Http\IRequest;
use Nette\Http\IResponse;
use Psr\Http\Message\ResponseInterface;

class Oauth2Response implements AppResponse
{

/** @var ResponseInterface */
private $psr7;

public function __construct(ResponseInterface $psr7)
{
$this->psr7 = $psr7;
}

public function send(IRequest $httpRequest, IResponse $httpResponse): void
{
$httpResponse->setCode($this->psr7->getStatusCode());

foreach ($this->psr7->getHeaders() as $name => $values) {
foreach ($values as $value) {
$httpResponse->addHeader($name, $value);
}
}

$stream = $this->psr7->getBody();
$stream->rewind();

while (!$stream->eof()) {
echo $stream->read(8192);
}
}

}
45 changes: 45 additions & 0 deletions tests/cases/E2E/PresenterTest.php
@@ -0,0 +1,45 @@
<?php declare(strict_types = 1);

namespace Tests\Cases\E2E;

use Contributte\OAuth2Server\Http\Oauth2Response;
use Contributte\Psr7\Psr7Response;
use Nette\Application\IPresenter;
use Nette\Application\IResponse;
use Nette\Application\Request;
use Nette\Http\RequestFactory;
use Nette\Http\Response;
use Ninjify\Nunjuck\Toolkit;
use Psr\Http\Message\ResponseInterface;
use Tester\Assert;

require_once __DIR__ . '/../../bootstrap.php';

Toolkit::test(function (): void {
$presenter = new class implements IPresenter {

/** @var ResponseInterface */
public $psr7;

public function run(Request $request): IResponse
{
return new Oauth2Response($this->psr7);
}

};

$psr7 = Psr7Response::fromGlobals()
->withStatus(200);
$psr7->getBody()->write('test');

$presenter->psr7 = $psr7;
$response = $presenter->run(new Request('test'));

ob_start();
$response->send((new RequestFactory())->fromGlobals(), new Response());
$result = ob_get_contents();
ob_end_clean();

Assert::equal(200, http_response_code());
Assert::equal('test', $result);
});

0 comments on commit 6ce09a5

Please sign in to comment.