[N予備校プログラミングコース] 第3章 Basic 認証、秘密の匿名掲示板

N予備校プログラミングコース 第3章の続き。

Basic 認証

認証によるログインの学習。
Web で使われる認証には OAuth などもあるが、ここではまず昔ながらの(?) Basic 認証。
http-auth というパッケージを使って認証を行う。
これも昔 Perl で CGI 書いてた頃は、プログラムというよりはこんな感じで Apache の設定ファイルを弄って対応という認識だったので、サーバプログラム側に実装するというのは何だか不思議な感じ。

あと、ログアウトする際は 401 を返す、というのを今回初めて知ったw

秘密の匿名掲示板

ここからは、これまで学習した内容を活かし、何回かに分けて「秘密の匿名掲示板」というのを開発する。

先に学習した Basic 認証によって、ログインした人のみが閲覧や投稿ができる。
「匿名」とあるが、5ちゃんねるのように一定期間 Cookie によってトラッキングすることで、同じ人間があたかも複数人で投稿しているような振る舞いができないようにしたり、また管理者権限からはどの認証ユーザーによる投稿なのかが分かるようにする、という最低限のトラッキングはできるようになっている。
また投稿内容は DB に保存され、投稿者は自分の投稿のみ削除することができ、管理者は自分を含む全てのユーザーの全ての投稿を削除する権限を持つ。
Web 掲示板自体はそれこそ90年代からあるものだが、こうしてみるとサーバーサイドの Web プログラミングに最低限必要な知識が一通り求められるものだと思う。

ちなみに現時点での開発状況は↓こんな感じ。
スクリーンショット 2018-05-26 9.24.38.png
何だか CSS の読み込みに失敗している感じだが、デザインはこれからなので、これは正常動作。

ID:7617〜 というのはランダムで生成したユーザーのトラッキングIDで、Cookie に24時間保存される。
管理者が投稿したものはトラッキングIDの代わりに「管理人 ★」と表示される。
管理者権限でログインしているので、ゲストユーザーの投稿であっても削除ボタンが表示されているが、ゲストユーザーがログインした場合は自分の投稿以外は削除ボタンは表示されないようになっている。

削除ボタンや「管理人 ★」の表示判定は Node.js の HTML テンプレートエンジンである pug の機能を使ったものだ。
HTML テンプレート上で if 文による分岐ができるのだ。
投稿の一覧表示は、プログラム(JavaScript)側で DB にアクセスして取得した投稿内容を、HTML テンプレートで each-in 文を使って繰り返し表示することで実現している。

なお DB へのアクセスは SQL 文を直接書くのではなく、sequelize という Node.js 用の O/R マッパーを使用している。
ちなみに DB は PostgreSQL を使用しているが、sequelize は MySQL はもちろん、SQLite や MS SQL Server にも対応しているそうだ。

ところで /posts に GET でアクセスすると↑のスクショのように投稿一覧、POST でアクセスすると投稿処理後、再び /posts に GET でアクセスするようリダイレクトする。(削除時は /posts?delete=1 とクエリを付けて POST アクセス)
昔 Perl の CGI で掲示板作ったりしてた時、POST した後リロードすると同じ内容が再度投稿されてしまうので、HTML 内に meta タグを書いてリダイレクトするとかそんな苦し紛れなことをやったりしていたが、HTTP のステータスコード 30x でリダイレクトするのだ、ということも初めて知ったw
ってか昔の CGI の入門サイトとか本とかには、そんなこと一切書いてなかった気がするなぁ。

この後は CSS を使って見た目のデザインの改善、さらに昨今の Web アプリでは必須な脆弱性対策、そしていよいよ Heroku への公開。
来週末外泊で自宅に戻る予定なので、その前に何とか入門編は終えられそうである。

この記事へのコメント