Chrononglyph

#7123

webアプリのログイン認証

今日の出来事web制作

この2連休は、新ピクチャレ大会にログイン認証を実装する作業にすべてを捧げました。
寝ている以外のほとんどの時間を費やし、日曜日の26時についにログイン通過。
この紆余曲折はぜひQiitaにでも書いて共有したいところではありますが、
経緯を丁寧に書いているとそれだけでまた数日潰れるのでブログで勘弁してください。


まず、要件として今回のログイン機能はフロントエンドがNext.js、
バックエンドがLaravelでそれぞれをDockerが仮想コンテナ上に構築している、
という前提のもと、名前とパスワードのみ登録していた前サービスを引き継ぐ必要がありました。
そこで最初に取り掛かったのがLaravelが提供する「Laravel Breeze」というライブラリ。
これを導入すればすごく簡単にログイン認証をつけられるというもので、
実際に2020年にLaravelの研修を受けた際にもできた記憶があるので、
まあこれが無難だろと思って着手しました。が、丸一日かけても実装することはできませんでした。


その主な要因は2つ。
まず、Laravel Breezeは基本的にLaravelで完結するwebアプリを想定していること。
つまり、フロントエンドもLaravelのBlade等で表示する想定の構造になっているということです。
もちろんそのBladeをReact等に置き換えることはできなくはないのですが、
今回のプロジェクトは表示部分とAPI部分をコンテナから分離してしまったため、
Laravelで構築したサービスを運用するためにはどうしたってAPIを通さなければなりません。
Laravel Breezeの内部構造を見るとAPIではないルートにもアクセスするよう定義されていて、
ここにアクセスできるようにいまから改修するのは非常に難しい。
というか自分にできるのかという問題が。


もうひとつは、LaravelコンテナとNextコンテナはそれぞれ別のネットワークなので、
これを両者間で認証情報を伴う通信を開通させるのが非常に難しい。
言うなれば異なるコンテナはそれぞれ見知らぬ人が運営するサイトのようなものなので、
当然簡単に相互書き込みできないようにネットワーク上のルールが決められています。
その例外を作ってトンネルを開けるのですが、
Dockerだとこっちから見るとlocalhostなのにあっちからは全然違うIPだったりしてややこしい。
結局これで匙を投げて、別のライブラリを探すことにしました。
それまででも結構な作業時間を費やしていたので損切りには勇気が要りました。


次に試したのは「Next-Auth」。つまり、今度はフロントエンド側のライブラリ。
簡単にSSO(シングルサインオン)を構築できるなどハードルの低さが売りみたいで、
もちろんパスワード認証にも対応している。
これは期待できるぞと思っていざ着手してみると、
公式のドキュメントがあまりにも少ないことに気づきました。
公式はパスワード認証を「非推奨」としており、なるべく使ってほしくない意図があるそうです。
なのでいちおう機能としては用意するけど、パスワードの保存先や暗号化は自前で実装してね、
ということらしい。なんてこった。
しかし世界は広いもので、自前でフルスタックのNext-Auth製パスワード認証機能を作った猛者が、
Githubに全ソースを公開していたのでそれを参考に作ることにしました。


パスワードの保存先は最近流行りのクラウドサービスに頼るという手もありましたが、
既存のMySQLサーバーを流用できる「Prisma」というライブラリに頼ることにしました。
これはざっくり言うとフロントエンド側でデータベースの中身を操作できるライブラリです。
具体的にはデータの読み書きはもちろん、テーブルの作成や定義、初期値の入れ込みなど、
Laravelでできる基本的なことはシンプルにできるようになっています。
あまりにもあっさりできたので、
「これもうLaravel要らないんじゃね?」と思わずにいられませんでした。


ただそこから先は苦行でした。無料公開していたGithubのオープンソースも結構ガバガバで、
とにかく押しても引いてもエラーが出る。そのたびにエラーの内容を検証しては次に進む。
2日目の夜からはChatGPTにも頼ってひたすらエラーをつぶしまくりました。
そして苦節30時間(推定)、ついにログインに成功!
いやー、webプログラミングでここまでの達成感を味わったのはひさびさな気がする。
この2日だけでDevToolsの使い方を始め、かなり問題解決能力は上がったと思います。
あとやっぱりプログラミング分野に関してはChatGPTは有能ですね。
「この情報群のどこかに答えはあるんだけどその探し方がわからない」
といった場合にソースコードとエラーメッセージを投げると結構的確に答えてくれました。
割と真面目にChatGPTが自分にとってのメンターになりうると思っています。
いままではエラーが出たら「エラーメッセージでググる」「公式ドキュメントを読む」
といった程度が関の山でしたが、
今回の試行錯誤を経て「ロガーを仕込む」「ネットワークログを読み解く」
といった手法も開拓しました。
特に後者はコンソールでエラーが出ていない場合もエラーが表示されている場合があり、
非同期通信などを伴う処理ではチェックは必須と言って良さそうです。


残り時間がどんどん少なくなってきて少しずつ焦りも出てきたピクチャレ大会開発ですが、
ひとまず最大の山場(?)を越えられたのはなによりです。
あと1つ大型のタスクを残しているのですが、それが今回よりキツくないことを祈っています……。



同じタグを含む記事(web制作
前後の記事
#7106社会人黎明期の計画失敗』(2023/06/01
計画の立て方今日の出来事
#7107仮想通貨利益の乱高下』(2023/06/02
暗号資産今日の出来事
#7108睡眠用イヤホンの耐久性』(2023/06/03
イヤホン睡眠用イヤホン今日の出来事
#7109ナンピンの浅はかさ』(2023/06/04
暗号資産今日の出来事
#7110No'man Sky macOS版』(2023/06/05
no-mans-sky今日の出来事
#7111Apple Vision Pro発表』(2023/06/06
MR今日の出来事
#7112ピクミン4追加情報』(2023/06/07
ピクミン4今日の出来事
#7113コンプラ順守の難しさ』(2023/06/08
ブログとコンプライアンス今日の出来事
#7114京王線で人助けを見た』(2023/06/09
他者観察今日の出来事
#7115上京の真意』(2023/06/10
我が家の猫今日の出来事
#7116ゆるやかな共産主義』(2023/06/11
世代論今日の出来事
#7117美容業界の強かな戦略』(2023/06/12
民間サービス今日の出来事
#7118海外取引所の締め出し』(2023/06/13
暗号資産今日の出来事
#7119マウントについて』(2023/06/14
言論の問題今日の出来事
#7120生成AIとNFT』(2023/06/15
stable-diffusion今日の出来事
#7121Netflixによるゲーム買収』(2023/06/16
特定文化批判今日の出来事
#7122同じような夢を見る』(2023/06/17
夢日記今日の出来事
#7123webアプリのログイン認証』(2023/06/18
web制作今日の出来事
#7124発達障害という概念の功罪』(2023/06/19
発達障害今日の出来事
#7125RADWIMPSの歌詞』(2023/06/20
j-pop今日の出来事
#7126恋愛観のジレンマ』(2023/06/21
恋愛観今日の出来事
#7127Aphex Twin新EP』(2023/06/22
エレクトロニカ今日の出来事
#7128二次元イラスト収集』(2023/06/23
二次元の女の子準非公開の記事今日の出来事
#7129内科に行った』(2023/06/24
健康診断今日の出来事
#7130Apex Legendのランクマ問題』(2023/06/25
apex-legends今日の出来事
#7131婚活の損得勘定』(2023/06/26
恋愛観今日の出来事
#7132海外取引所の締め出し #2』(2023/06/27
暗号資産今日の出来事
#7133チョコボのゲームカードの記憶』(2023/06/28
小学校時代カードゲーム今日の出来事
#7134マッチングアプリの欠陥』(2023/06/29
恋活・婚活今日の出来事
#7135社会的弱者を見下すということ』(2023/06/30
他人観今日の出来事