- Work done to support Basic / Bearer / Digest method

This commit is contained in:
Dave Mc Nicoll 2023-11-13 14:23:24 -05:00
parent 0f2886b266
commit 9570320a3b
8 changed files with 33 additions and 11 deletions

View File

@ -3,13 +3,14 @@
namespace Ulmus\User\Authorize\Header;
use Psr\Http\Message\ServerRequestInterface;
use Ulmus\User\Entity\BasicAuthUserInterface;
use Ulmus\User\Entity\UserInterface;
use Ulmus\User\Lib\Authorize;
class BasicMethod
class BasicMethod implements MethodInterface
{
public function __construct(
protected UserInterface $user,
protected BasicAuthUserInterface $user,
protected string|array $arguments
) {}
@ -28,7 +29,7 @@ class BasicMethod
throw new \RuntimeException("A password must be provided");
}
( new Authorize($this->user) )->authenticate([ 'email' => $userName, 'username' => $userName ], $password);
( new Authorize($this->user) )->authenticate([ $this->user->usernameField() => $userName ], $password);
return $this->user->loggedIn();
}

View File

@ -5,7 +5,7 @@ namespace Ulmus\User\Authorize\Header;
use Psr\Http\Message\ServerRequestInterface;
use Ulmus\User\Entity\UserInterface;
class BearerMethod
class BearerMethod implements MethodInterface
{
public function __construct(
protected UserInterface $user,

View File

@ -5,7 +5,7 @@ namespace Ulmus\User\Authorize\Header;
use Psr\Http\Message\ServerRequestInterface;
use Ulmus\User\Entity\DigestAuthUserInterface;
class DigestMethod
class DigestMethod implements MethodInterface
{
public function __construct(
protected DigestAuthUserInterface $user,

View File

@ -0,0 +1,10 @@
<?php
namespace Ulmus\User\Authorize\Header;
use Psr\Http\Message\ServerRequestInterface;
interface MethodInterface
{
public function execute(ServerRequestInterface $request) : bool;
}

View File

@ -15,24 +15,27 @@ class HeaderAuthentication implements AuthorizeMethodInterface
switch(strtolower($method)) {
case "basic":
return (new Header\BasicMethod($user, $value))->execute($request);
$methodObj = new Header\BasicMethod($user, $value);
break;
case "digest":
if (! $user instanceof DigestAuthUserInterface) {
throw new \RuntimeException("Your user entity must provide a valid hash of `user:realm:password` ");
}
return (new Header\DigestMethod($user, $value))->execute($request);
$method = new Header\DigestMethod($user, $value);
break;
case "bearer":
return (new Header\BearerMethod($user, $value))->execute($request);
$method = new Header\BearerMethod($user, $value);
break;
default:
throw new \InvalidArgumentException("An authentication method must be provided");
}
}
return false;
return isset($methodObj) && $methodObj->execute($request);
}

View File

@ -0,0 +1,8 @@
<?php
namespace Ulmus\User\Entity;
interface BasicAuthUserInterface extends UserInterface
{
public function usernameField() : string;
}

View File

@ -2,7 +2,7 @@
namespace Ulmus\User\Entity;
interface DigestAuthUserInterface
interface DigestAuthUserInterface extends UserInterface
{
# Represent a hash (md5, sha256, ...) of username:realm:password
public function getSecretHash() : string;

View File

@ -77,7 +77,7 @@ abstract class User implements UserInterface {
public function verifyPassword(string $password) : bool
{
return password_verify($password, $this->password);
return password_verify($password, $this->password ?? null);
}
public function fullName() : string