Ground Sunlight

Windowsで作る - Webプログラミングの開発環境(PHP)

ユーザ用ツール

サイト用ツール


サイドバー

メインメニュー

道具箱

リポジトリ編

フレームワーク編

公開ソフトウェア

メタ
リンク


このページへのアクセス
今日: 1 / 昨日: 1
総計: 127

apricot:ext:basic-auth

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;
    }
}
  • $this->exclude 配列に含まれているコントローラは認証から除外します。(公開のWebAPIなど)
  • AuthUser::verify() で既に認証されているかを調べ、認証されていれば次の処理に制御を渡します。

  • まだユーザ認証されていない場合:
    • AuthUser::authenticate() にユーザの入力したアカウント情報を渡し認証を行います。
    • 認証が成功した場合:
      • 次の処理に制御を渡します。
    • 認証が失敗した場合:
      • ヘルパー関数 render() を呼び出してレスポンスをレンダリングします。
      • render(string $view=null, array $variables=[])
        1. $view : テンプレート名
          上例では assets/views/error/basic_auth.blade.php がテンプレートファイルになります
        2. $variables : テンプレート変数の連想配列
          上例では $messageをテンプレートに渡しています。
      • 401 Unauthorized をヘッダーに追加してブラウザに基本認証を要求します。

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. */
    ],
  • middleware にミドルウェア \App\Middleware\Auth\BasicAuth::class を追加します。


テスト実行

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

  • ユーザ : 'root'
  • パスワード : '' ※空文字

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

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

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

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

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

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


コメント

コメントを入力. Wiki文法が有効です:
 
apricot/ext/basic-auth.txt · 最終更新: 2020/06/08 14:03 by tanaka