Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

LaravelでDBを使用しないbasic認証を簡単につくるtips

2,275 views

Published on

雑兵Meetup #6 zohyo-fesでの発表資料になります。
「l5-very-basic-auth」というDB情報を使わないステートレスなbasic認証をLaravelで簡単に実装できる(導入してルーティングに宣言するだけ)ライブラリの概要と導入手順の紹介になります。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

LaravelでDBを使用しないbasic認証を簡単につくるtips

  1. 1. LaravelでDBを使用しないbasic認証を 簡単につくるtips 雑兵MeetUp #6 zohyo-fes 2016/09/16 Fumiya Sakai
  2. 2. 自己紹介と簡単な経歴など ✦ 今までの仕事履歴(本業) 石川県金沢市生まれ 本業はサーバーサイドのプログラマ ※Rails&PHP使い 26歳〜31歳: Webプログラマ(PHP & Rubyがキャリア長い) 23歳〜25歳: Webデザイナー兼ディレクター チャンスがあればiOSアプリ開発も絶賛やってみたい! 趣味:シルバーアクセサリー集め・スイーツ作り・アプリ開発 女子向け・グルメ・エンタメ関連のお仕事が多い Qiita : http://qiita.com/fumiyasac@github Github : https://github.com/fumiyasac ✦ 酒井文也(さかい ふみや) 東京(大塚)住まいの31歳 こんな格好を普段からしているので 遊び人に見られますがエンジニアです。 文系卒に思われますが 実は数学科で理系卒です。 めっちゃお酒好きそうに見えますが ビール苦手でお酒も超弱いです。 今でもたまにUIまわりとか触りたく なることがあったりなかったり 今年の4月からフリーランスです。 (割とお堅い感じの会社にいます) 最近のはまっている食べ物は カボチャと担々麺と甘栗です。 最近はSwift以外ではRailsやLaravel・CakePHP・Node.jsなんかも
  3. 3. これまでに作ったもの(ネイティブアプリ) ① 簡易家計簿アプリ「Coffre」 ② ゲームアプリ「10秒虫食い算」 ・カレンダーを自作しています ・シンプルなお小遣い帳感覚で支出管理できます ・全問正解者ほとんどいません… ・不定期ですがコラムも書いています ・サーバーサイドはRuby on Railsを使用 http://www.coffre.me/ ・デザインにもこだわってみました(特にグラフ) ・実はちょっとバグがあります。 ・問題は今後追加予定(現在110問収録) 個人的にはなりますが、他にもアプリ・Webサービスなど開発中です(2016年も宜しくお願いします) ・サイト等は次回のアップデートで公開予定 http://blog.just1factory.net/services/284 ・若干の中毒性を含みます
  4. 4. 人生で初めてiOSのライブラリを作りました 日本の祝祭日を計算で出してくれる ・カレンダーアプリ等での活用を想定 ・シルバーウィーク・ゴールデンウィークも対応 ・ハッピーマンデー法の施行も対応 ・春分の日・秋分の日にも対応 ・過去の祝祭日もおおむね考慮はしている 構想や基本実装は僕ですが、他に3名のContributorのお力添えがあり実運用できるレベルになりました! 職人の手作業で計算しております! ・HTTP(HTTPS)通信は不要 ★CalculateCalendarLogic ver0.0.2 【だが本業は今もサーバーサイドです】PHP(メインのframeworkはSymfony) & Ruby(Sinatraに近いもの?) ・Github: https://github.com/fumiyasac/handMadeCalendarAdvance ・実装解説: http://qiita.com/fumiyasac@github/items/33bfc07ad36dfffcdf8f ・Github: https://github.com/fumiyasac/handMadeCalendarOfSwift
  5. 5. ✦ 実装方法に関してはドキュメントやブログ等参考資料が多い Laravelにはすでに認証機能が入っている ドキュメントに加えて実際のまっさらなソースの時点でも考慮がされている 柔軟な設計が可能な構成や強力で実運用にも活用できうるライブラリの多さは本当におもしろい 認証機能やマイグレーション機能・MVCに縛られすぎない柔軟な構成・強力なライブラリ群やDocsがイイ! ★流石Laravelさん準備がいいですね! ・認証機能は新規作成するにしても改修するにしても0から作るのはしんどい部分 ・セキュリティの観点やサイトやサービスの運営の根幹に関わる重要な部分 ★認証部分を構築する上で参考にできそうなリンク集 セッションを使用した認証にもbasic認証にも対応しているのは嬉しいポイント ・Laravel5.1 認証: https://readouble.com/laravel/5.1/ja/authentication.html ・初めてのLARAVEL 5.1: (28)認証: https://goo.gl/Ak583t 【初期状態のサポートの手厚さや(英語だけど)TIPSも多いのがLaravelの魅力】 ・初めてのLARAVEL 5.1: (29) パスワード再設定: https://goo.gl/2HeK9T ・提供されている基本実装を逸脱しなければ改修もしやすいはず
  6. 6. ✦ 開発の現場でよくある認証絡みのところの要望 理想は入れるだけのシンプルな感じにしたい 自分でbasic認証をするミドルウェアなりを作成したりカスタマイズをかけるのはちょっと怖い感じも…。 ★basic認証とセッションを使った認証の二段構え ★開発中ページのProduction環境テスト時やAPIアクセスの一時的な認証など ・Production環境で一時的にbasic認証をかけて画面テスト → basic認証を外すデプロイを行う場合 ・アプリの中からアクセスする用のAPIにて、Webからの直アクセスを制限したい サービス画面 会員様用画面 マスタ管理画面 【※この部分】 【確かに気持ちはとってもわかる。けどどうしよう…】 認証機能をカスタマイズしようと思ったけど、いざ着手してみると以外のこのあたりのTIPSはなかった。 例) ※ ユーザー情報認証   +     basic認証 ※ ユーザー情報認証 ・できるだけアプリケーションで使用しているフレームワーク内でよしなにしたい ユーザー情報による認証を実装済みであってもbasic認証が欲しくなるケースは生じる
  7. 7. ✦ 今回使うのは「l5-very-basic-auth」というライブラリ ステートレスにbasic認証ができるライブラリ basic認証をかけるべきエンドポイントで柔軟に設定できるようになるのでふとした時にとっても便利! ★ちなみにLaravelのドキュメントにはどんな感じで書かれているか ★導入の流れをざっくりと紹介すると下記の流れ ・手順1) composer.jsonに記載をしてインストールをする ・手順2) 設定ファイルを自分のアプリケーションに書き出した後にprovidersにちょこっと追記 Route::get('admin', ['middleware' => 'auth.basic', function() { // 認証済みユーザーのみが入れる… }]); 参考:How to create http basic Authentication in Laravel 5?:https://goo.gl/3HqT1Y 1. ユーザー情報に依存しないbasic認証機構 2. ルーティング部分のみで完結できる仕様 ・手順3) 設定ファイルにID/PASS等を書いてルーティングのmiddlewareをこれに変えればOK l5-very-basic-authを導入するメリット Basic認証であっても ユーザーデータを使う仕様 参考:l5-very-basic-auth:https://packagist.org/packages/olssonm/l5-very-basic-auth
  8. 8. ✦ composer.jsonに記載をしてインストール&設定ファイルを書き出し 毎度おなじみの手順でライブラリの準備 まあ、ここは特にいうことは何もありませんね…。いつも通りのLaravelでライブラリを導入するお仕事。 ★毎度おなじみの手順になります。 "require": { … "olssonm/l5-very-basic-auth": “^1.2" //追記 }, composer.json $ sudo composer update $ sudo php artisan vendor:publish -provider="OlssonmVeryBasicAuthVeryBasicAuthServiceProvider" in your console return [ … //サービス・プロバイダーの設定 'providers' => [ … OlssonmVeryBasicAuthVeryBasicAuthServiceProvider::class, ], ]; config/app.php
  9. 9. ✦ コマンドで吐き出した基本設定の雛形ファイルに設定を追記 設定ファイルの形式はこんな感じ ★設定ファイルをconfigディレクトリ内に持つ config/very_basic_auth.php内でID/PWはもちろんBasic認証を適用する環境やエラー文言も設定可能です。 /** * Configuration for the "HTTP Very Basic Auth"-middleware */ return [ // Username 'user' => 'ユーザー名', // Password 'password' => 'パスワード', // Environments where the middleware is active 'envs' => [ 'local', 'dev', 'development', 'staging', 'production', 'testing' ], // Message to display if the user "opts out"/clicks "cancel" 'error_message' => 'You have to supply your credentials to access this resource.' ]; config/very_basic_auth.php
  10. 10. ✦ ミドルウェアの設定を「very_basic_auth」を読むようにする。 ルーティングに設定する際はこんな感じ 手順や導入もかなりしやすいけれどもbasic認証を使う局面が出てきそうなら予め入れておいてもいいかも。 【終わりです!お疲れさまでした!】 Route::group(['middleware' => 'auth.very_basic', 'prefix' => ''], function() { //トピックの新規追加画面 Route::get('/topics/add', 'TopicsController@add'); Route::post('/topics/create', 'TopicsController@create'); //任意idのトピック編集 Route::get('/topics/edit/{id}', 'TopicsController@edit'); Route::post('/topics/update/{id}', 'TopicsController@update'); //任意idのトピック削除 Route::post('/topics/delete', 'TopicsController@delete'); }); app/Http/routes.php ★いつものルーティングのファイルのミドルウェアを変えれば終了 詳しい解説記事:Laravel本体の認証機能とは別にDB情報を使わないbasic認証を実装するサンプル http://qiita.com/fumiyasac@github/items/cdf854008e7487148a67 リポジトリ:https://github.com/fumiyasac/laravel-minimum-tutorial basic認証の追加差分はこちら:https://goo.gl/uW08Jx
  11. 11. ✦ せっかくなんでテストケースも書いてみましょうか (付録) Basic認証のUnitテストはこんな感じ basic認証のブラウザ確認は面倒くさい。そんな時にUnitテストを書いておくとここは認証対象だとわかる。 ★確認するために何度もブラウザ立ち上げたりするのはメンドイ… /* Basic認証があって誤ったID/PASSWORDだと401になるテスト */ public function testIncorrectBasicAuthLogin() { //誤ったID/PASSWORDを記述 $basic_auth_config_incorrect = ['user' => 'admin', 'password' => 'admin12']; //call( $method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null) $this->call('GET', '/topics/add', [], [], [], ['PHP_AUTH_USER' => $basic_auth_config_incorrect['user'], 'PHP_AUTH_PW' => $basic_auth_config_incorrect['password']]); $this->assertResponseStatus(401); $this->call('GET', '/topics/edit/1', [], [], [], ['PHP_AUTH_USER' => $basic_auth_config_incorrect['user'], 'PHP_AUTH_PW' => $basic_auth_config_incorrect['password']]); $this->assertResponseStatus(401); $this->call('POST', 'topics/delete', [], [], [], ['PHP_AUTH_USER' => $basic_auth_config_incorrect['user'], 'PHP_AUTH_PW' => $basic_auth_config_incorrect['password']]); $this->assertResponseStatus(401); } tests/ApplicationRoutingTest.php HTTPステータスコードが401を返却するテストを記述する(成功時のテストの場合は200を返す)
  12. 12. ✦ 認証部分はこけると危ないので設計が重要 今回のまとめ ご清聴ありがとうございました!またこのような機会があった際には是非ともよろしくお願い致します! ★複数の選択肢やライブラリの検討 認証が必要なケースの場合は、できるだけLaravel側の認証機能を崩さないようにしたい ★ライブラリを使う際には「動くこと + α」の精査を 現在動いている事実だけでは不十分なので、ライブラリの保守状況や使用時のTIPSも把握しておく ★テストはやっぱりあると便利 絶対ないといけない局面でテストがあると実装の際にも気がつくことができるから良い ★自分ルール 【良いアウトプットのために】 発表・登壇時はこの中のいずれか2つを 絶対に準備するルールを設けています!

×