843 lines
27 KiB
PHP
843 lines
27 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This file is part of Slim HTTP Basic Authentication middleware
|
||
|
*
|
||
|
* Copyright (c) 2013-2018 Mika Tuupola
|
||
|
*
|
||
|
* Licensed under the MIT license:
|
||
|
* http://www.opensource.org/licenses/mit-license.php
|
||
|
*
|
||
|
* Project home:
|
||
|
* https://github.com/tuupola/slim-basic-auth
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
namespace Tuupola\Middleware\HttpBasicAuthentication;
|
||
|
|
||
|
use Equip\Dispatch\MiddlewareCollection;
|
||
|
use PHPUnit\Framework\TestCase;
|
||
|
use Psr\Http\Message\RequestInterface;
|
||
|
use Psr\Http\Message\ResponseInterface;
|
||
|
use Psr\Http\Message\ServerRequestInterface;
|
||
|
use Test\TrueRule;
|
||
|
use Test\FalseRule;
|
||
|
use Test\TrueAuthenticator;
|
||
|
use Test\FalseAuthenticator;
|
||
|
use Tuupola\Middleware\HttpBasicAuthentication;
|
||
|
use Tuupola\Http\Factory\ResponseFactory;
|
||
|
use Tuupola\Http\Factory\ServerRequestFactory;
|
||
|
use Tuupola\Http\Factory\StreamFactory;
|
||
|
|
||
|
class HttpBasicAuthenticationTest extends TestCase
|
||
|
{
|
||
|
public function testShouldFailWithoutAuthenticator()
|
||
|
{
|
||
|
$this->expectException("RuntimeException");
|
||
|
$auth = new HttpBasicAuthentication();
|
||
|
}
|
||
|
|
||
|
public function testShouldReturn200WithoutPassword()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/public");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("Success", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldReturn401WithoutPassword()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => ["/admin"],
|
||
|
"realm" => "Not sure",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
$this->assertEquals('Basic realm="Not sure"', $response->getHeaderline("WWW-Authenticate"));
|
||
|
$this->assertEquals("", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldReturn200WithPassword()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item")
|
||
|
->withHeader("Authorization", "Basic cm9vdDp0MDBy");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("Success", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldReturn200WithOptions()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("OPTIONS", "https://example.com/admin/item");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("Success", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldReturn200WithoutPasswordWithAnonymousFunction()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$auth = $auth->addrule(function ($request) {
|
||
|
return false;
|
||
|
});
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("Success", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldReturn200WithIgnore()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/ping");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"ignore" => "/admin/ping",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("Success", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldReturn401WithFromAfter()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item")
|
||
|
->withHeader("Authorization", "Basic cm9vdDp0MDBy");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
],
|
||
|
"after" => function ($response, $arguments) {
|
||
|
return $response
|
||
|
->withBody((new StreamFactory)->createStream())
|
||
|
->withStatus(401)
|
||
|
->withHeader("WWW-Authenticate", 'Basic realm="Go away!"');
|
||
|
}
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
$this->assertEquals('Basic realm="Go away!"', $response->getHeaderline("WWW-Authenticate"));
|
||
|
$this->assertEquals("", (string) $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldAlterResponseWithAfter()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item")
|
||
|
->withHeader("Authorization", "Basic cm9vdDp0MDBy");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
],
|
||
|
"after" => function ($response, $arguments) {
|
||
|
return $response->withHeader("X-Brawndo", "plants crave");
|
||
|
}
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("plants crave", (string) $response->getHeaderLine("X-Brawndo"));
|
||
|
}
|
||
|
|
||
|
public function testShouldCallErrorHandlerWith401()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
],
|
||
|
"error" => function ($response, $arguments) {
|
||
|
$response->getBody()->write("ERROR: " . $arguments["message"]);
|
||
|
return $response;
|
||
|
}
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
$this->assertEquals("ERROR: Authentication failed", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testErrorHandlerShouldAlterHeaders()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
],
|
||
|
"error" => function ($response, $arguments) {
|
||
|
return $response
|
||
|
->withStatus(302)
|
||
|
->withHeader("Location", "/foo/bar");
|
||
|
}
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(302, $response->getStatusCode());
|
||
|
}
|
||
|
|
||
|
/*** OTHER *************************************************************/
|
||
|
|
||
|
public function testShouldReturn200WithTrueAuthenticator()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"authenticator" => new \Test\TrueAuthenticator()
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("Success", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldReturn401WithFalseAuthenticator()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"authenticator" => new \Test\FalseAuthenticator()
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
$this->assertEquals("", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldReturn200WithAnonymousFunction()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"authenticator" => function ($arguments) {
|
||
|
return true;
|
||
|
}
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("Success", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldReturn401WithAnonymousFunction()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item")
|
||
|
->withHeader("Authorization", "Basic cm9vdDp0MDBy");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"authenticator" => function ($arguments) {
|
||
|
return false;
|
||
|
}
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
$this->assertEquals("", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldModifyRequestUsingBefore()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin/item")
|
||
|
->withHeader("Authorization", "Basic cm9vdDp0MDBy");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/admin",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
],
|
||
|
"before" => function ($request, $arguments) {
|
||
|
return $request->withAttribute("user", $arguments["user"]);
|
||
|
}
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$user = $request->getAttribute("user");
|
||
|
$response->getBody()->write($user);
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("root", (string) $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldNotAllowInsecure()
|
||
|
{
|
||
|
$this->expectException("RuntimeException");
|
||
|
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "http://example.com/api");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/api",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
}
|
||
|
|
||
|
public function testShouldRelaxInsecureInLocalhost()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "http://localhost/api");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"secure" => true,
|
||
|
"path" => "/api",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
}
|
||
|
|
||
|
public function testShouldRelaxInsecureViaSetting()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "http://example.com/api");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"secure" => true,
|
||
|
"relaxed" => ["localhost", "example.com"],
|
||
|
"path" => "/api",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
}
|
||
|
|
||
|
public function testShouldRelaxForwardedViaSetting()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "http://example.com/api")
|
||
|
->withHeader("X-Forwarded-Proto", "https")
|
||
|
->withHeader("X-Forwarded-Port", "443");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"secure" => true,
|
||
|
"relaxed" => ["localhost", "headers"],
|
||
|
"path" => "/api",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
}
|
||
|
|
||
|
public function testShouldBeImmutable()
|
||
|
{
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/api",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$auth2 = $auth->addRule(new TrueRule);
|
||
|
$auth3 = $auth->withRules([new TrueRule]);
|
||
|
|
||
|
/* Closure kludge to test private properties. */
|
||
|
$self = $this;
|
||
|
|
||
|
$closure = function () use ($self) {
|
||
|
$self->assertEquals(2, count($this->rules));
|
||
|
};
|
||
|
call_user_func($closure->bindTo($auth, HttpBasicAuthentication::class));
|
||
|
|
||
|
$closure = function () use ($self) {
|
||
|
$self->assertEquals(3, count($this->rules));
|
||
|
};
|
||
|
call_user_func($closure->bindTo($auth2, HttpBasicAuthentication::class));
|
||
|
|
||
|
$closure = function () use ($self) {
|
||
|
$self->assertEquals(1, count($this->rules));
|
||
|
};
|
||
|
call_user_func($closure->bindTo($auth3, HttpBasicAuthentication::class));
|
||
|
}
|
||
|
|
||
|
public function testShouldHandlePsr15()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$default = function (RequestInterface $request) {
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
$collection = new MiddlewareCollection([
|
||
|
new HttpBasicAuthentication([
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
])
|
||
|
]);
|
||
|
$response = $collection->dispatch($request, $default);
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
$this->assertEquals("", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testShouldHandleRulesArrayBug()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/api");
|
||
|
|
||
|
$default = function (ServerRequestInterface $request) {
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$collection = new MiddlewareCollection([
|
||
|
new HttpBasicAuthentication([
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
],
|
||
|
"rules" => [
|
||
|
new RequestPathRule([
|
||
|
"path" => ["/api"],
|
||
|
"ignore" => ["/api/login"],
|
||
|
]),
|
||
|
new RequestMethodRule([
|
||
|
"ignore" => ["OPTIONS"],
|
||
|
])
|
||
|
],
|
||
|
])
|
||
|
]);
|
||
|
|
||
|
$response = $collection->dispatch($request, $default);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
$this->assertEquals("", $response->getBody());
|
||
|
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/api/login");
|
||
|
|
||
|
$response = $collection->dispatch($request, $default);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("Success", $response->getBody());
|
||
|
}
|
||
|
|
||
|
/*** BUGS *************************************************************/
|
||
|
|
||
|
public function testBug2UrlShouldMatchRegex()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/status/foo");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/stat",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("Success", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testBug3ShouldReturn401WithoutTrailingSlash()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
$this->assertEquals("", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testBug3ShouldReturn401WithTrailingSlash()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/admin");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => "/",
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
$this->assertEquals("", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testBug9ShouldAllowUnauthenticatedHttp()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/public/foo");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => ["/api", "/bar"],
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"root" => "t00r",
|
||
|
"user" => "passw0rd"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("Success", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testBug31ShouldAllowColonInPassword()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/api/foo")
|
||
|
->withHeader("Authorization", "Basic Zm9vOmJhcjpwb3A=");
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => ["/api", "/bar"],
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"foo" => "bar:pop"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(200, $response->getStatusCode());
|
||
|
$this->assertEquals("Success", $response->getBody());
|
||
|
}
|
||
|
|
||
|
public function testPull59ShouldNotErrorWithMalformedCredentials()
|
||
|
{
|
||
|
$request = (new ServerRequestFactory)
|
||
|
->createServerRequest("GET", "https://example.com/api/foo")
|
||
|
->withHeader("Authorization", "Basic Zm9vCg=="); /* foo */
|
||
|
|
||
|
$response = (new ResponseFactory)->createResponse();
|
||
|
|
||
|
$auth = new HttpBasicAuthentication([
|
||
|
"path" => ["/api", "/bar"],
|
||
|
"realm" => "Protected",
|
||
|
"users" => [
|
||
|
"foo" => "bar"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
|
||
|
$response->getBody()->write("Success");
|
||
|
return $response;
|
||
|
};
|
||
|
|
||
|
$response = $auth($request, $response, $next);
|
||
|
|
||
|
$this->assertEquals(401, $response->getStatusCode());
|
||
|
$this->assertEquals("", $response->getBody());
|
||
|
}
|
||
|
}
|