Laravel Passwordless Authentication 無密碼驗證登入 Signed URL
Laravel PHP 網路科技

Laravel Passwordless Authentication 無密碼驗證登入,使用 Signed URL (簽署過的網址)

Passwordless Authentication 無密碼驗證登入是這幾年有在討論的技術議題,包含微軟、Google、Apple 態度上應該都是往這方向走。

無密碼登入的實現方式包含:登入時在預先綁定的 mobile device 壓指紋驗證。或是傳簡訊或 Email 到之前註冊的手機或信箱,使用者依照簡訊或 Email 的內容 (通常是一串碼),輸入網站做登入,等等。

實踐的方式各有變化,撰文的現在 (2023年7月) 還沒有一個通用的規範。

larry 之前關於 中華電信 Hami Video 的文章,Hami Video 就是用手機簡訊方式做無密碼登入。當然,那篇文章也提到:Hami Video 的背後是中華電信,只有電信商才能負擔這麼大量的手機簡訊費用。

無密碼登入適合哪種用戶使用?特別適合網站的低頻使用用戶,甚至一次性、或是幾個月、一兩年才使用一次的用戶。對於這些用戶,他們不用去管理密碼,並保密自己的密碼,自己設定的密碼強度也有可能不夠。

「保密自己的密碼」這句話邏輯上似乎有點好笑。但根據 larry 這麼多年服務客戶的經驗,還是有人直接密碼明碼給別人,請別人幫忙去處理事情。不是說不相信別人,而是我們就事論事,這樣密碼就有可能外洩。

有時候教育的成本很高,還不如設計無密碼登入。

今年 (2023) 三月份,larry 看到 Laravel 官網有一篇關於無密碼登入的文章。它是用寄 Email 給用戶的方式,Email 中包含一個簽署過的網址 (Signed URL),用戶點該連結後直接登入。
https://laravel-news.com/passwordless-authentication-in-laravel

這篇 Laravel 官網文章有附作者的 GitHub Repo,程式架構的東西看文字不一定好懂,直接從作者的 sample project 來看可能會更為理解。

首先 resources/views/app/auth/login.blade.php 中包含了<livewire:auth.login-form />

resources/views/app/auth/register.blade.php 中包含了<livewire:auth.register-form />

它是用 Laravel Livewire 開發的,讀者不一定要使用 Livewire,本篇重點在理解 Laravel 官網文章的概念。

Livewire 的 component 概念可以參考我之前的文章 Laravel Blade Templates:Components, Slots, and Building Layouts

其中 class based component 的概念,Livewire 應該是基於此開發的。

上方提到的 <livewire:auth.login-form /> 對應到 app/Http/Livewire/Auth/LoginForm.php

<livewire:auth.register-form /> 對應到 app/Http/Livewire/Auth/RegisterForm.php

使用者送出 Email 時會觸發 LoginForm::submit 這個 function,裡面會觸發 app/Actions/Auth/SendLoginLink.php

SendLoginLink::handle 裡面會使用 Laravel 內建的 URL::temporarySignedRoute 將你指定的網址簽章編碼,並設定該連結的有效期限。Signed Route 是 Laravel 5.6 開始支援,時間過的真的好快啊。

SendLoginLink::handle 將簽章編碼好的連結傳給 Mailable,並寄給用戶。Mailable 是 app/Mail/Auth/LoginLink.php

使用者收信點連結後導回網站,由 controller LoginController::__invoke 檢查簽章、登入、以及轉向指定網頁。

以上就是整個 Email 用戶 Signed URL,使用者無密碼登入的流程。Laravel 官網文章也有附使用者無密碼「註冊」的 sample code,但只是無密碼登入的變化,這裡就不再重複。

結論

Passwordless Authentication 無密碼驗證登入不只是一個登入方式的變化,而是很值得參考的網路科技的趨勢,至少包含微軟、Google、Apple 態度上應該都是往這個方向走。

本篇討論的 Laravel 官網文章是用 Email 用戶 Signed URL 的方式,Laravel 早已有簽章網址的模組,可以很輕易且漂亮的實作,並且可以指定簽章網址的有效期限。

除了無密碼登入,很多商業應用都可以使用 Signed URL 的方式。Signed URL 概念上、實作上,應該是一個滿值得大家了解的功能。

FB公開社團 Larry的午茶時光
加入不需審核,歡迎讀者加入~
我的IG帳號: larry.time.taste。剛剛起步,歡迎大家追蹤~