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);
+    }
+}