きまブログ

2022-12から再開しました。

ユーザー認証 Authを学ぶ - Simpleauth編

ウェブアプリのMVC構成、コードの自動生成。Scaffold。
と順に追いかけてきましたが、
次は。。


ウェブアプリを開発する場合、「ユーザー認証」は避けて通れないので、
次のステップとして、ユーザー認証を題材にして、新登場するいくつかの事を学習していきたいと思います。

FuelPHPに用意された認証パッケージ

FuelPHPでは、デフォルトで、以下の3種類が使えるようです。
これから、(何回かにわけて)上から順に動作を確認していきますよ。

Simpleauth
ユーザー情報を「データベース」その他の情報を「設定ファイル」へ保存し、ユーザー認証する、シンプル(?)な認証
Ormauth
Simpleauthが設定ファイルに保存した情報を、データベースへ保存する方式。
より高度なアクセスコントロールができるらしい。。
Opauth
ここ数年、多くのウェブサイトで見かける「Teitterでログイン」的なヤツの事。
かっこいいw ユーザー情報をもたなくていいなら、これが良さげ。

設定 - Simpleauth編

設定ファイル - Simpleauth編

パッケージの設定ファイルを、appの方へコピーします。

/fuel/app/config$ cp ../../packages/auth/config/auth.php .
/fuel/app/config$ cp ../../packages/auth/config/simpleauth.php  .

なぜか、なにも修正しなくても動きますw
ただ、セキュリティ上、修正したほうが良い項目もあります。

  1. saltとは?

ソルト。塩です。
パスワードは、そのまま「平文」で保存するのは危険なので、
あるルールで変換して保存します。(ハッシュ)
ユーザーがログインするときに入力する文字列も、あるルールで変換して、
変換後の値が保存した値と一致しているかを見ているようです。
(パスワードそのものが一致しているのを確認してるわけではないようです。。)


その時に、
パスワードをハッシュする前にパスワードに「内緒の文字列」をくっつけて、ハッシュすることで、
パスワード単体のハッシュ値とは異なるハッシュ値を得て、セキュリティを高める意味合いがあります。
この「内緒の文字列」が「塩」です。
塩というのは、“隠し味"的な意味でしょうか??

パッケージのいつもロード(always_load)設定

/fuel/core/config
'always_load'→‘packages’配列に、authを追加。

マイグレーション - Simpleauth編
oil refine migrate --packages=auth

とすると、/fuel/package/auth/migration/にあるマイグレーションファイルを実行してくれるみたい。。

$ oil refine migrate --packages=auth
Performed migrations for package:auth:
001_auth_create_usertables
002_auth_create_grouptables
003_auth_create_roletables
004_auth_create_permissiontables
005_auth_create_authdefaults
006_auth_add_authactions
007_auth_add_permissionsfilter
008_auth_create_providers
009_auth_create_oauth2tables
010_auth_fix_jointables

コード作成 - Simpleauth編

とにかく、最低限ログインの成否とユーザー登録だけできるようにしました。
セキュリティ上も、絶対ヤバイので、要注意です。

Controller - Simpleauth編

自動コード生成のための補習 - Controller編 - きまブログ
自動コード生成のための補習 - View編 - きまブログ
を参考にして、
コントローラーを自動生成します。

$ oil generate controller login register

生成されたコードを、
はじめに - Simpleauth - Auth パッケージ - FuelPHP ドキュメント
を参考にして、以下のように、修正します。
とはいっても、ほとんど、このサンプルページと同じですw


ただ、「ログイン成功ページ」を作るのがめんどかったんで、
「成功」表示だけして、ログイン画面を戻りますw無限ループです。


失敗すると「失敗」表示されます。

/fuel/app/classes/controller$ cat ./login.php 
<?php

class Controller_Login extends Controller_Template
{

     public function action_index()
     {
          $data = array();
          if (Input::post())
          {
               if(Auth::login(Input::post('email'), Input::post('password')))
               {
                    Session::set_flash('success','login success.');
               }
               else
               {
                    Session::set_flash('error','login failure.');
               }
          }
          $this->template->title = 'Login';
          $this->template->content = View::forge('login/index', $data);
     }

     public function action_register()
     {
          $data = array();
          if (Input::post())
          {
               Auth::create_user(
                    Input::post('username'),
                    Input::post('password'),
                    Input::post('email')
               );
               Session::set_flash('success','success create your account.');
               Response::redirect('login/');
          }
          $data["subnav"] = array('register'=> 'active' );
          $this->template->title = 'Login &raquo; Register';
          $this->template->content = View::forge('login/register', $data);
     }

}
View - Simpleauth編

Viewは、ログイン画面と、ユーザー登録用の画面作成しておきます。

/fuel/app/views/login$ cat index.php 
<p>Login</p>
<?php
     echo Form::open();
     echo Form::input('email');
     echo Form::input('password');
     echo Form::submit('submit','Login');
     echo Form::close();
     echo Html::anchor('login/register','Please, Regist');
?>
/fuel/app/views/login$ cat register.php 
<p>Register</p>
<?php
     echo Form::open();
     echo Form::input('email');
     echo Form::input('username');
     echo Form::input('password');
     echo Form::submit('submit','Regist Me.');
     echo Form::close();
     echo Html::anchor('login/','Back to Login');
?>


新しく使うAuthクラスのメソッドで使うのは、2つ。特に難しい感じはしません。


・Auth::login(‘ユーザー名orメアド’,'パスワード’);
 そのまま。。ログインに使います。


・Auth::create_user('ユーザー名','パスワード',’メアド’);
 そのまま。。ユーザー作成に使います。


これで、https://localhost/public/login/ へアクセスすると、
うまく動きました。

メモ

とりあえず、現状での問題点は、こんな感じかな?

セキュリティ上、かなりやばい。

下にも書いた項目以外にも、この状態はかなりヤバイです。
ただ、性善説的なプライベートネット内で、
ミス予防程度のログイン管理ならこれでいいかもw

文字列検査してない。

全部空白で「Regist Me.」ボタンを押すと、create_user()メソッドで例外を吐く。
必要に応じて、特殊な記号とか、メアドの検査とかしなきゃいけない。

未ログイン状態の処理

ログインしていない場合、ログイン画面へ誘導しなくちゃいけない。
これは before()に書いとくのか?

ほかにもいろいろ画面が必要なんだね。。
  • ユーザー情報編集画面
  • 管理画面


とりあえず、Simpleauthは、以上です。。