====== Apricot 基本認証 ======
--- //[[http://www.y2sunlight.com|y2sunlight]] 2020-05-15//
[[apricot:top|Apricot に戻る]]
関連記事
* [[apricot:configuration|Apricot プロジェクトの作成]]
* [[apricot:public|Apricot 公開フォルダ]]
* [[apricot:core:top|Apricot コア]]
* [[apricot:app:top|Apricot アプリ]]
* Apricot 拡張
* [[apricot:ext:middleware|Apricot ミドルウェア]]
* [[apricot:ext:access-log|Apricot アクセスログ]]
* [[apricot:ext:csrf|Apricot CSRF対策]]
* [[Apricot:ext:user-auth|Apricot ユーザ認証]]
* Apricot 基本認証
* [[apricot:ext:session-auth|Apricot セッション認証]]
* [[apricot:ext:interceptor|Apricot インターセプター]]
* [[apricot:ext:di-container|Apricot DIコンテナー]]
ミドルウェアを使ってユーザの基本認証を実装します。本章ではApricotのユーザ認証機能を使用しているので、まだお読みでない方は先に[[Apricot:ext:user-auth|そちら]]をご一読下さい。
基本認証は簡易的でログイン画面を作る必要もなく、少人数のユーザで使用する小規模なアプリ向けです。Webサーバの機能を使って基本認証を行うこともできますが、ログインユーザの管理が簡単にできるので、PHPによる基本認証機能の実装の方がお薦めです。尚、Apricotでは最終的に後述のセッション認証の方を採用します。
----
===== ミドルウェア =====
以下に、基本認証のミドルウェアを示します。
{{fa>folder-open-o}} ** /apricot/app/Middleware/Auth **
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;
}
}
* [[apricot:ext:middleware#Middleware インターフェース|Middleware インターフェース]]の process() メソッドを実装します。
* $this->exclude 配列に含まれているコントローラは認証から除外します。(公開のWebAPIなど)
* AuthUser::verify() で既に認証されているかを調べ、認証されていれば次の処理に制御を渡します。\\ \\
* まだユーザ認証されていない場合:
* AuthUser::authenticate() にユーザの入力したアカウント情報を渡し認証を行います。
* 認証が成功した場合:
* 次の処理に制御を渡します。
* 認証が失敗した場合:
* ヘルパー関数 render() を呼び出してレスポンスをレンダリングします。
* **render(string $view=null, array $variables=[])**
- $view : テンプレート名\\ 上例では assets/views/error/basic_auth.blade.php がテンプレートファイルになります
- $variables : テンプレート変数の連想配列\\ 上例では $messageをテンプレートに渡しています。
* ''401 Unauthorized'' をヘッダーに追加してブラウザに基本認証を要求します。
AuthUser の使用方法については、[[apricot:ext:user-auth#authuserクラス|こちら]]をご覧ください。
\\
===== エラー画面 =====
基本認証では ''401 Unauthorized'' ヘッダーをブラウザに送信する際に、エラー画面(ユーザが[キャンセル]ボタンを押した場合などで表示される画面)も送信する必要があります。以下に基本認証のミドルウェアでレンダリングしているエラー画面用のHTMLテンプレート( error.basic_auth )を示します。
{{fa>folder-open-o}} ** /apricot/assets/views/error **
{{-- 親レイアウト --}}
@extends('error.layout')
{{-- コンテンツ --}}
@section('content')
@endsection
* ''extends'', ''section'' の各ディレクティブについては、[[apricot:app:top#htmlテンプレート|スタブ画面]] を参照して下さい。
* 継承している親テンプレート(error.layout)は[[apricot:app:error#error.layout|エラー画面共通のレイアウト]]です。
* ボイラープレート''__()'', '' route()'' については、[[apricot:app:top#layoutbladephp|layout.blade.php]] を参照して下さい。
\\
===== 翻訳テキスト =====
ユーザ認証用の翻訳ファイル( auth.php )を作ります。
{{fa>folder-open-o}} ** apricot/assets/lang/ja **
[
'msg_needed_login'=>'このページを見るにはログインが必要です',
'back'=>'戻る',
],
];
\\
===== 基本認証の設定 =====
基本認証のミドルウェアをアプリケーションに設置します。
{{fa>folder-open-o}} ** /apricot/config**
'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 を追加します。
\\
===== テスト実行 =====
基本認証のテストをしてみましょう。初期状態(既定値)のユーザ名とパスワードは以下の通りです。初期のユーザ名とパスワードは [[apricot:app:db-model#設定ファイル|idirom.setup.php]]に設定されています。
* ユーザ : '''root'''
* パスワード : '''''' ※空文字
ブラウザ上でホーム画面にアクセスすると:
http://localhost/ws2019/apricot/public/
次のような基本認証画面が表示されます。\\ (この画面はブラウザが表示しているのでブラウザによって異なります)
[{{apricot:ext:ext04.png?nolink}}]
■ 正しいユーザ名とパスワードを入力して[ログイン]ボタンを押すと、ホーム画面が画面が表示されます。
[{{apricot:ext:ext05.png?nolink}}]
■ 基本認証では、一旦認証されるとセッションが無くなるまでその状態が継続されます。ログアウトもできません。ログアウトしたい場合は、ブラウザを閉じて下さい。
基本認証画面で[キャンセル]ボタンを押した場合は以下のエラー画面が表示されます。
[{{apricot:ext:ext06.png?nolink}}]
\\