目次

Apricot 基本認証

y2sunlight 2020-05-15

Apricot に戻る

関連記事

ミドルウェアを使ってユーザの基本認証を実装します。本章ではApricotのユーザ認証機能を使用しているので、まだお読みでない方は先にそちらをご一読下さい。

基本認証は簡易的でログイン画面を作る必要もなく、少人数のユーザで使用する小規模なアプリ向けです。Webサーバの機能を使って基本認証を行うこともできますが、ログインユーザの管理が簡単にできるので、PHPによる基本認証機能の実装の方がお薦めです。尚、Apricotでは最終的に後述のセッション認証の方を採用します。


ミドルウェア

以下に、基本認証のミドルウェアを示します。

/apricot/app/Middleware/Auth

BasicAuth.php
<?php
namespace App\Middleware\Auth;
 
use Core\Foundation\Response;
use Core\Foundation\Invoker;
use Core\Foundation\Middleware\Middleware;
use App\Foundation\Security\AuthUser;
 
/**
 * Basic認証 - Middleware
 */
class BasicAuth implements Middleware
{
    /**
     * Excludeing controller
     * @var array
     */
    private $exclude = [
    ];
 
    /**
     * Process incoming requests and produces a response
     * {@inheritDoc}
     * @see \Core\Foundation\Middleware\Middleware::invoke()
     */
    public function process(Invoker $next): Response
    {
        // When exclude controller
        if (in_array(controllerName(), $this->exclude))
        {
            return $next->invoke();
        }
 
        // Verify whether user is authenticated
        if (AuthUser::verify())
        {
            return $next->invoke();
        }
 
        // Basic認証
        if (array_key_exists('PHP_AUTH_USER', $_SERVER) && array_key_exists('PHP_AUTH_PW',$_SERVER))
        {
            if (AuthUser::authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
            {
                return $next->invoke();
            }
        }
 
        // 未認証の場合は '401 Unauthorized' をクライアントに送信
        $response = render('error.basic_auth', ['message'=>__('auth.basic.msg_needed_login')])
        ->addHeader("HTTP/1.0 401 Unauthorized")
        ->addHeader('WWW-Authenticate: Basic realm="Enter username and password."');
        return $response;
    }
}

AuthUser の使用方法については、こちらをご覧ください。


エラー画面

基本認証では 401 Unauthorized ヘッダーをブラウザに送信する際に、エラー画面(ユーザが[キャンセル]ボタンを押した場合などで表示される画面)も送信する必要があります。以下に基本認証のミドルウェアでレンダリングしているエラー画面用のHTMLテンプレート( error.basic_auth )を示します。

/apricot/assets/views/error

basic_auth.blade.php
{{-- 親レイアウト --}}
@extends('error.layout')
 
{{-- コンテンツ --}}
@section('content')
    <div class="flex-row message">
        <div class="mb">{{$message}}</div>
        <div><a href='{{route('')}}'>{{__('auth.basic.back')}}</a></div>
    </div>
@endsection


翻訳テキスト

ユーザ認証用の翻訳ファイル( auth.php )を作ります。

apricot/assets/lang/ja

auth.php
<?php
return [
    'basic'=>[
        'msg_needed_login'=>'このページを見るにはログインが必要です',
        'back'=>'戻る',
    ],
];


基本認証の設定

基本認証のミドルウェアをアプリケーションに設置します。

/apricot/config

app.php
    'setup' =>[
        ...
    ],
    'middleware' =>[
        \App\Middleware\AccessLog::class,        /* Access log */
        \App\Middleware\VerifyCsrfToken::class,  /* Verify CSRF Token */
        \App\Middleware\Auth\BasicAuth::class,   /* Basic Auth. */
    ],


テスト実行

基本認証のテストをしてみましょう。初期状態(既定値)のユーザ名とパスワードは以下の通りです。初期のユーザ名とパスワードは idirom.setup.phpに設定されています。

ブラウザ上でホーム画面にアクセスすると:

http://localhost/ws2019/apricot/public/

次のような基本認証画面が表示されます。
(この画面はブラウザが表示しているのでブラウザによって異なります)

■ 正しいユーザ名とパスワードを入力して[ログイン]ボタンを押すと、ホーム画面が画面が表示されます。

■ 基本認証では、一旦認証されるとセッションが無くなるまでその状態が継続されます。ログアウトもできません。ログアウトしたい場合は、ブラウザを閉じて下さい。

基本認証画面で[キャンセル]ボタンを押した場合は以下のエラー画面が表示されます。