You've already forked php-auth
generated from siteworxpro/Php-Template
Basics of auth
This commit is contained in:
165
src/Controllers/AuthorizeController.php
Normal file
165
src/Controllers/AuthorizeController.php
Normal file
@@ -0,0 +1,165 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Siteworxpro\App\Controllers;
|
||||
|
||||
use HansOtt\PSR7Cookies\SetCookie;
|
||||
use League\OAuth2\Server\Exception\OAuthServerException;
|
||||
use Nyholm\Psr7\Response;
|
||||
use Nyholm\Psr7\ServerRequest;
|
||||
use Nyholm\Psr7\Stream;
|
||||
use Psr\SimpleCache\InvalidArgumentException;
|
||||
use Siteworxpro\App\Helpers\Rand;
|
||||
use Siteworxpro\App\Http\JsonResponseFactory;
|
||||
use Siteworxpro\App\Http\Responses\ServerErrorResponse;
|
||||
use Siteworxpro\App\OAuth\Entities\Client;
|
||||
use Siteworxpro\App\Services\Facades\Logger;
|
||||
use Siteworxpro\App\Services\Facades\Redis;
|
||||
use Siteworxpro\HttpStatus\CodesEnum;
|
||||
|
||||
final class AuthorizeController extends Controller
|
||||
{
|
||||
/**
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
// #[\Override] public function post(ServerRequest $request): Response
|
||||
// {
|
||||
// $s = $request->getCookieParams()['s'] ?? '';
|
||||
//
|
||||
// $password = $request->getParsedBody()['password'] ?? '';
|
||||
// $email = $request->getParsedBody()['email'] ?? '';
|
||||
//
|
||||
// if (!$this->redis->get('session:' . $s)) {
|
||||
// $this->log->error('Session Timed out', ['session' => $s]);
|
||||
//
|
||||
// return $this->sendJsonResponse(
|
||||
// [
|
||||
// 'error' => "your login session has timed out. please try again."
|
||||
// ],
|
||||
// 400
|
||||
// );
|
||||
// }
|
||||
//
|
||||
// /** @var AuthorizationRequest $authRequest */
|
||||
// $authRequest = unserialize($this->redis->get('session:' . $s));
|
||||
//
|
||||
// if ($authRequest->isAuthorizationApproved()) {
|
||||
// $response = $this
|
||||
// ->authorizationServer
|
||||
// ->completeAuthorizationRequest($authRequest, $this->sendJsonResponse());
|
||||
//
|
||||
// return $this->sendJsonResponse(
|
||||
// [
|
||||
// 'success' => true,
|
||||
// 'location' => $response->getHeader('Location')[0]
|
||||
// ]
|
||||
// );
|
||||
// }
|
||||
//
|
||||
// /** @var Client $client */
|
||||
// $client = $authRequest->getClient();
|
||||
//
|
||||
// /** @var LoginInterface $entitiesModel */
|
||||
// $entitiesModel = $client->entities_model;
|
||||
//
|
||||
// /** @var User | null $entity */
|
||||
// $entity = $entitiesModel::performLogin($email, $password);
|
||||
// if (!$entity) {
|
||||
// return $this->sendJsonResponse(
|
||||
// [
|
||||
// 'success' => false,
|
||||
// 'reason' => 'login failed'
|
||||
// ],
|
||||
// 401
|
||||
// );
|
||||
// }
|
||||
//
|
||||
// $authRequest->setUser($entity);
|
||||
// $authRequest->setAuthorizationApproved(true);
|
||||
// $response = $this
|
||||
// ->authorizationServer
|
||||
// ->completeAuthorizationRequest($authRequest, $this->sendJsonResponse());
|
||||
//
|
||||
// $this->redis->delete('session:' . $s);
|
||||
//
|
||||
// return $this->sendJsonResponse(
|
||||
// [
|
||||
// 'success' => true,
|
||||
// 'location' => $response->getHeader('Location')[0]
|
||||
// ]
|
||||
// );
|
||||
// }
|
||||
|
||||
/**
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function get(ServerRequest $request): Response
|
||||
{
|
||||
try {
|
||||
if (!file_exists('public/index.html')) {
|
||||
throw new \RuntimeException('Frontend not built. Please run `npm run build`.');
|
||||
}
|
||||
$contents = file_get_contents('public/index.html');
|
||||
|
||||
if ($request->getQueryParams()['e']) {
|
||||
return new Response(
|
||||
200,
|
||||
['content-type' => 'text/html'],
|
||||
Stream::create($contents)
|
||||
);
|
||||
}
|
||||
|
||||
if (
|
||||
isset($request->getCookieParams()['s']) &&
|
||||
Redis::exists('session:' . $request->getCookieParams()['s'] ?? '')
|
||||
) {
|
||||
$s = $request->getCookieParams()['s'];
|
||||
} else {
|
||||
$s = Rand::string();
|
||||
}
|
||||
|
||||
$clientId = $request->getQueryParams()['client_id'] ?? '';
|
||||
Logger::info('Authorization request', ['client_id' => $clientId]);
|
||||
|
||||
$client = Client::byClientId($clientId);
|
||||
if ($client === null) {
|
||||
Logger::warning('Invalid client in authorization request', ['client_id' => $clientId]);
|
||||
throw OAuthServerException::invalidClient($request);
|
||||
}
|
||||
|
||||
$authRequest = $client->getAuthorizationServer()->validateAuthorizationRequest($request);
|
||||
Redis::set('session:' . $s, serialize($authRequest), 'EX', 60 * 60 * 24);
|
||||
|
||||
$response = new Response(
|
||||
200,
|
||||
['content-type' => 'text/html'],
|
||||
Stream::create($contents)
|
||||
);
|
||||
|
||||
$cookie = new SetCookie('s', $s, time() + 3600, '/', secure: true);
|
||||
|
||||
/** @var Response $response */
|
||||
$response = $cookie->addToResponse($response);
|
||||
|
||||
return $response;
|
||||
} catch (OAuthServerException $e) {
|
||||
return new Response(
|
||||
CodesEnum::TEMPORARY_REDIRECT->value,
|
||||
[
|
||||
'Location' => sprintf(
|
||||
'/authorize?e=%s&client_id=%s&response_type=%s&redirect_uri=%s#/error',
|
||||
$e->getMessage(),
|
||||
$request->getQueryParams()['client_id'] ?? '',
|
||||
$request->getQueryParams()['response_type'] ?? '',
|
||||
$request->getQueryParams()['redirect_uri'] ?? ''
|
||||
)
|
||||
]
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
Logger::error($e->getMessage(), ['exception' => $e]);
|
||||
|
||||
return JsonResponseFactory::createJsonResponse(new ServerErrorResponse($e));
|
||||
}
|
||||
}
|
||||
}
|
||||
30
src/Controllers/CapabilitiesController.php
Normal file
30
src/Controllers/CapabilitiesController.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Siteworxpro\App\Controllers;
|
||||
|
||||
use Nyholm\Psr7\ServerRequest;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Siteworxpro\App\Http\JsonResponseFactory;
|
||||
use Siteworxpro\App\Http\Responses\NotFoundResponse;
|
||||
use Siteworxpro\App\OAuth\Entities\Client;
|
||||
|
||||
final class CapabilitiesController extends Controller
|
||||
{
|
||||
/**
|
||||
* @throws \JsonException
|
||||
*/
|
||||
public function get(ServerRequest $request): ResponseInterface
|
||||
{
|
||||
$clientId = $request->getQueryParams()['client_id'] ?? '0';
|
||||
|
||||
$client = Client::byClientId($clientId);
|
||||
|
||||
if (!$client) {
|
||||
return JsonResponseFactory::createJsonResponse(new NotFoundResponse($request->getUri()->getPath()));
|
||||
}
|
||||
|
||||
return JsonResponseFactory::createJsonResponse($client->capabilities->toArray());
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,7 @@ use OpenApi\Attributes as OA;
|
||||
*
|
||||
* @package Siteworxpro\App\Controllers
|
||||
*/
|
||||
class HealthcheckController extends Controller
|
||||
final class HealthcheckController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handles the GET request for health check.
|
||||
|
||||
@@ -20,7 +20,7 @@ use Siteworxpro\App\Services\Facades\CommandBus;
|
||||
*
|
||||
* This class handles the index route of the application.
|
||||
*/
|
||||
class IndexController extends Controller
|
||||
final class IndexController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handles the GET request for the index route.
|
||||
|
||||
@@ -9,7 +9,7 @@ use Nyholm\Psr7\ServerRequest;
|
||||
use OpenApi\Generator;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
|
||||
class OpenApiController extends Controller
|
||||
final class OpenApiController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handles the GET request to generate and return the OpenAPI specification.
|
||||
|
||||
Reference in New Issue
Block a user