From 944c524cfb4bef0feb8b5b0f64c2265ec1479aa4 Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll <info@mcnd.ca> Date: Fri, 3 Nov 2023 08:26:48 -0400 Subject: [PATCH] - WIP on header-based authentication --- src/Authorize/AuthorizeMethodInterface.php | 11 +++++++ src/Authorize/BasicAuthentication.php | 34 ++++++++++++++++++++++ src/Common/AuthorizeEnum.php | 16 ++++++++++ src/Entity/UserInterface.php | 8 +++++ src/Lib/Authenticate.php | 2 +- src/Lib/Authorize.php | 18 ++++++++++++ src/Middleware/AuthenticateMiddleware.php | 29 ++++++++++++++++++ src/Middleware/AuthorizeMiddleware.php | 26 +++++++++++++++++ 8 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 src/Authorize/AuthorizeMethodInterface.php create mode 100644 src/Authorize/BasicAuthentication.php create mode 100644 src/Common/AuthorizeEnum.php create mode 100644 src/Entity/UserInterface.php create mode 100644 src/Lib/Authorize.php create mode 100644 src/Middleware/AuthenticateMiddleware.php create mode 100644 src/Middleware/AuthorizeMiddleware.php diff --git a/src/Authorize/AuthorizeMethodInterface.php b/src/Authorize/AuthorizeMethodInterface.php new file mode 100644 index 0000000..36a43db --- /dev/null +++ b/src/Authorize/AuthorizeMethodInterface.php @@ -0,0 +1,11 @@ +<?php + +namespace Ulmus\User\Authorize; + +use Psr\Http\Message\ServerRequestInterface; +use Ulmus\User\Entity\UserInterface; + +interface AuthorizeMethodInterface +{ + public function connect(ServerRequestInterface $request) : UserInterface|false; +} \ No newline at end of file diff --git a/src/Authorize/BasicAuthentication.php b/src/Authorize/BasicAuthentication.php new file mode 100644 index 0000000..fc21214 --- /dev/null +++ b/src/Authorize/BasicAuthentication.php @@ -0,0 +1,34 @@ +<?php + +namespace Ulmus\User\Authorize; + +use Psr\Http\Message\ServerRequestInterface; +use Ulmus\User\Entity\UserInterface; + +class BasicAuthentication implements AuthorizeMethodInterface +{ + public function connect(ServerRequestInterface $request): UserInterface|false + { + if ( null === $auth = $request->getHeader('Authorization') ) { + list($method, $userPass) = explode(' ', $auth, 2) + [ null, null ]; + + if (! $method ) { + throw new \InvalidArgumentException("An authentication method must be provided"); + } + elseif (! $userPass ) { + throw new \InvalidArgumentException("A base64-encoded 'user:password' value must be provided"); + } + + + return false; + } + + return false; + } + + protected function basicMethod(string $header) : UserInterface|false + { + + } + +} \ No newline at end of file diff --git a/src/Common/AuthorizeEnum.php b/src/Common/AuthorizeEnum.php new file mode 100644 index 0000000..9839acd --- /dev/null +++ b/src/Common/AuthorizeEnum.php @@ -0,0 +1,16 @@ +<?php + +namespace Ulmus\User\Common; + +enum AuthorizeEnum : string +{ + case Basic = "basic"; + case Token = "token"; + + # case Bearer = "bearer"; +# case Custom = "custom"; +# case Digest = "digest"; +# case Key = "key"; +# case Ntlm = "ntlm"; +# case Negotiate = "negotiate"; +} diff --git a/src/Entity/UserInterface.php b/src/Entity/UserInterface.php new file mode 100644 index 0000000..7c1b010 --- /dev/null +++ b/src/Entity/UserInterface.php @@ -0,0 +1,8 @@ +<?php + +namespace Ulmus\User\Entity; + +interface UserInterface +{ + public function __toString() : string; +} \ No newline at end of file diff --git a/src/Lib/Authenticate.php b/src/Lib/Authenticate.php index 9d02681..f605988 100644 --- a/src/Lib/Authenticate.php +++ b/src/Lib/Authenticate.php @@ -37,7 +37,7 @@ class Authenticate { { $logUser = function(? int $id) use ($repository) { if ( $id === null || null === ( $user = $repository->loadFromPk($id) ) ) { - throw new \Exception("User not found."); + throw new \InvalidArgumentException(sprintf("User having id '%s' was not found.", $id)); } $user->logged = true; diff --git a/src/Lib/Authorize.php b/src/Lib/Authorize.php new file mode 100644 index 0000000..8825c8b --- /dev/null +++ b/src/Lib/Authorize.php @@ -0,0 +1,18 @@ +<?php + +namespace Ulmus\User\Lib; + +use Ulmus\User\Entity\User; + +class Authorize extends Authenticate +{ + public function rememberMe(\Ulmus\Repository $repository) : ? User + { + return null; + } + + public function authorize(\Ulmus\Repository $repository, array $userLogin, string $password) : User + { + + } +} \ No newline at end of file diff --git a/src/Middleware/AuthenticateMiddleware.php b/src/Middleware/AuthenticateMiddleware.php new file mode 100644 index 0000000..718df86 --- /dev/null +++ b/src/Middleware/AuthenticateMiddleware.php @@ -0,0 +1,29 @@ +<?php + +namespace Ulmus\User\Middleware; + +use Psr\Http\{ + Message\ResponseInterface, + Message\ServerRequestInterface, + Server\MiddlewareInterface, + Server\RequestHandlerInterface +}; +use Ulmus\User\Authorize\AuthorizeMethodInterface; +use Ulmus\User\Common\AuthorizeEnum; + +class AuthorizeMiddleware implements MiddlewareInterface +{ + public function __construct( + protected AuthorizeMethodInterface $method, + protected ResponseInterface $loginFailed, + ) { } + + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface + { + if ( false ) { + return $this->loginFailed; + } + + return $handler->handle($request); + } +} diff --git a/src/Middleware/AuthorizeMiddleware.php b/src/Middleware/AuthorizeMiddleware.php new file mode 100644 index 0000000..7b8bd13 --- /dev/null +++ b/src/Middleware/AuthorizeMiddleware.php @@ -0,0 +1,26 @@ +<?php + +namespace Ulmus\User\Middleware; + +use Psr\Http\{ + Message\ResponseInterface, + Message\ServerRequestInterface, + Server\MiddlewareInterface, + Server\RequestHandlerInterface +}; + +class AuthorizeMiddleware implements MiddlewareInterface +{ + public function __construct( + protected ResponseInterface $loginFailed + ) { } + + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface + { + if ( false ) { + return $this->loginFailed; + } + + return $handler->handle($request); + } +}