Использование базовой авторизации в качестве промежуточного программного обеспечения PSR-7 PSR-15 - PullRequest
0 голосов
/ 23 октября 2018

TD; LR: я пытаюсь понять идею реализации промежуточного программного обеспечения.Кажется, он работает, но как мне правильно обработать ответ, чтобы он отображал в браузере приглашение на вход в систему с базовой авторизацией?

-

Я использую:

Выполнениекод ниже:

$middleware = [
    new \Middlewares\ResponseTime(),
    (new \Middlewares\BasicAuthentication([
        'username1' => 'password1',
        'username2' => 'password2'
    ]))->attribute('username')
];

// Default handler for end of collection
$default = function (\GuzzleHttp\Psr7\ServerRequest $request) {
    // Any implementation of PSR-7 ResponseInterface
    return new \GuzzleHttp\Psr7\Response();
};

$collection = new \Equip\Dispatch\MiddlewareCollection($middleware);

// Any implementation of PSR-7 ServerRequestInterface
$request = \GuzzleHttp\Psr7\ServerRequest::fromGlobals();
$response = $collection->dispatch($request, $default);

print_r($response);

Возвращает следующее:

GuzzleHttp\Psr7\Response Object
(
    [reasonPhrase:GuzzleHttp\Psr7\Response:private] => Unauthorized
    [statusCode:GuzzleHttp\Psr7\Response:private] => 401
    [headers:GuzzleHttp\Psr7\Response:private] => Array
        (
            [WWW-Authenticate] => Array
                (
                    [0] => Basic realm="Login"
                )

            [X-Response-Time] => Array
                (
                    [0] => 16.176ms
                )

        )

    [headerNames:GuzzleHttp\Psr7\Response:private] => Array
        (
            [www-authenticate] => WWW-Authenticate
            [x-response-time] => X-Response-Time
        )

    [protocol:GuzzleHttp\Psr7\Response:private] => 1.1
    [stream:GuzzleHttp\Psr7\Response:private] => 
)

Похоже, middlewares/response-time и middlewares/http-authentication были выполнены просто отлично.Тем не менее, у меня сложилось впечатление, что middlewares/http-authentication будет отображать фактическое приглашение к входу в систему, например:

enter image description here

Но это не так.Я должен сам это реализовать?Если да, как я могу сделать это правильно?

1 Ответ

0 голосов
/ 30 октября 2018

Пожалуйста, измените область на «Моя область».

$middleware = [
    new \Middlewares\ResponseTime(),
    (new \Middlewares\BasicAuthentication([
        'username1' => 'password1',
        'username2' => 'password2'
    ]))->attribute('username')->realm('My realm')
];

Запрос GuzzleHttp происходит в бэкэнде, поэтому он не будет работать, как обычно, в браузере, например, запрашивая имя пользователя и пароль.Вы в основном имитируете запрос, когда используете Guzzle без каких-либо браузеров.Таким образом, если вы хотите запросить подсказку, вам придется реализовать эту логику без использования GuzzleHttp.

Вы все еще можете протестировать его с помощью Guzzle, как показано ниже.

Приведенный ниже код будет работать.

$request = \GuzzleHttp\Psr7\ServerRequest::fromGlobals()->withHeader('Authorization', 'Basic '.base64_encode('username1:password1'));
$response = $collection->dispatch($request, $default);
echo $response->getStatusCode(); //200
echo $response->getReasonPhrase(); // OK

Приведенный ниже код завершится ошибкой.

$request = \GuzzleHttp\Psr7\ServerRequest::fromGlobals()->withHeader('Authorization', 'Basic '.base64_encode(''IncorrectUser:IncorrectPassword''));
$response = $collection->dispatch($request, $default);
echo $response->getStatusCode(); //401
echo $response->getReasonPhrase(); // Unauthorized

Наилучший способ реализации BasicAuthentication будет в рамках промежуточного программного обеспечения.

Zend Expressive

   //Example using your library
   $app->pipe((new \Middlewares\BasicAuthentication([
                    'username1' => 'password1',
                    'username2' => 'password2'
                    ])
            )->attribute('username')->realm('My realm'));

    //Example using other library
    $app->pipe(new Tuupola\Middleware\HttpBasicAuthentication([
        "users" => [
            "root" => "t00r",
            "user" => "passw0rd"
        ]
    ]));

Оба приведенных выше кода работают должным образом.Например, запросить имя пользователя и пароль в браузере и разрешить пользователю просматривать содержимое при отправке правильных учетных данных.Жадность вызывает у вас проблемы.

Надеюсь, это поможет.

...