Vorbereitung für Preflight- und CORS-Abfragen.

This commit is contained in:
2021-04-12 18:46:37 +02:00
parent e29a6dcab9
commit b5af0c5a54
3 changed files with 81 additions and 1 deletions
@@ -0,0 +1,60 @@
<?php
namespace TorstenHettstedt\TimekeepingApi\Middleware;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Routing\RouteContext;
class OriginAccessControlHandler implements MiddlewareInterface
{
/**
* Process an incoming server request.
*
* Processes an incoming server request in order to produce a response.
* If unable to produce the response itself, it may delegate to the provided
* request handler to do so.
*/
public function process(Request $request, RequestHandler $handler): Response
{
$response = $handler->handle($request);
return $this->originAccessControl($request, $response);
}
public function originAccessControl(Request $request, Response $response): Response
{
$routeContext = RouteContext::fromRequest($request);
$routingResults = $routeContext->getRoutingResults();
$methods = $routingResults->getAllowedMethods();
$requestHeaders = $request->getHeaderLine('Access-Control-Request-Headers');
if ($this->testRoute($request)) {
$response = $response->withHeader('Access-Control-Allow-Origin', $this->buildOrigin($request));
$response = $response->withHeader('Access-Control-Allow-Methods', implode(',', $methods));
$response = $response->withHeader('Access-Control-Allow-Headers', $requestHeaders);
// Optional: Allow Ajax CORS requests with Authorization header
$response = $response->withHeader('Access-Control-Allow-Credentials', 'true');
}
return $response;
}
protected function testRoute(Request $request): bool
{
$corsAllowOriginRegex = $_ENV['CORS_ALLOW_ORIGIN_REGEX'] ?? '/https?:\/\/.*:.*/';
return preg_match($corsAllowOriginRegex, $this->buildOrigin($request));
}
protected function buildOrigin(Request $request): string
{
return $request->getHeaderLine('Origin') ?? '';
}
}