雜談
Hi,這裡是PK還在廢,一個坑還沒填完就開始挖新坑了,學習的道路上滿路瘡痍XD。這次也是因為工作所接觸到的,User希望可以在進入網站前進行認證,並且記錄相關認證資訊,避免重複登入導致的時間浪費。在這之前沒有特別處理過身分認證的問題,因為以前的專案都是本地端隨便跑( 被揍。難得有這個機會決定來找找相關解決方案,並記錄下來和大家分享d(`・∀・)b。
傳統網頁驗證架構
以上是傳統的網頁驗證架構,一般會於後端架設自己的Authentication Server。當User登入後會傳遞登入請求到Frontend Server, Frontend Server再將User輸入的資料加密傳遞到Authentication Server進行認證。如果認證成功會傳遞相關用戶資料或Access Key之類的資訊給Frontend Server使用,反之如果失敗會顯示error message,提示用戶哪邊錯誤。
這個架構的好處是很簡單易懂,前期架設其實很簡單,但缺點是需要花費額外的心力去維護Authentication Server。服務商需要具備相關資安技術,並且要自行處理資料加密與安全性升級。此外,對於User來說我每個網站都需要創一個帳號,管理起來會超級麻煩。想必大家都有久久想登入卻想不起密碼的情境吧,當下應該氣到快翻桌了(/‵Д′)/~ ╧╧。
這邊簡單整理一下傳統網頁驗證架構的優劣 :
- 優點
- 容易理解和架設
- 缺點
- 服務供應商需要自行維護一套Authentication Server,需要具備相關資安技術
- 對User來說,額外創立帳號很難管理且容易忘記
- 每次都需要花費時間重新登入
Social Login
那要如何改善這些缺點呢? 其實大家平常已經很常接觸到了,就是透過綁定大型的社交帳號來創建服務的新帳號,這種機制叫做 Social Login,常見的就是Google Account, Apple Account, Microsoft Account等等。你只要有一組帳號就可以在各網站或服務註冊帳號,並且登入對應帳號就可使用。
Social Login都會遵循OAuth這個開源的無密碼登入(Passwordless Login)標準,OAuth允許使用者讓第三方應用(Frontend Server)訪問特定網站(OAuth Provider)的用戶授權與資訊,並且不會將密碼資訊傳遞給Frontend Server。有點文言對吧,簡單來說特定網站(Google, Apple, etc.)是擔保人或信託機構,具備公信力與相關用戶資訊。User授權Frontend Server去跟這些OAuth Provider要User的相關資料,以下是簡化的流程圖 :
💡 OAuth後續還有提出OAuth 2.0,以及新版本基於OAuth 2.0擴展的Open ID Connect (OIDC),如果未來有空會簡單介紹,這裡挺複雜的( ˘•ω•˘ )。
User會選擇對應的OAuth Provider, Browser會依據選擇導向到對應的OAuth Provider,並且獲取授權碼(Public key, Token, etc.),這串授權碼會加密。有些系統會讓授權碼保留在Browser的Cookie,方便每次登入確認是否過期?是否需要重新登入?
授權碼雖然也會過期,不過一般時間會比較長,而時間較短的是Access Token,這個Token具備於OAuth Provider獲取使用者資訊的權限,會被傳送至Frontend Server進行相關邏輯判斷或資料獲取。完成資料獲取或操作後,系統會將結果傳遞回Browser讓網頁重新導向或刷新頁面。
💡 一般不會將授權碼傳送至Frontend Server,目的為避免被濫用,而作為替代會送時效較短Access Token,讓Frontend Server進行資料獲取或操作。
雖然Social Login很棒,不過還是有些不適合企業應用的地方,這邊簡單整理一下Social Login的優劣勢 :
- 優點
- 不需要自己架設Authentication Server
- 簡化使用者登入與註冊
- 缺點
- 在內網的應用情境無法使用 (無法連上OAuth Provider)
- 高企業機密,需要控管登入人員的應用不太適合 (權限控管能力有限)
Single Sign On
其實Single Sign On (SSO) 做的事情和Social Login的事情是一樣的,差異僅在於它不是使用我們常見的Social Network,所以Social Login 也有 Social Single Sign On (Social SSO)的別稱。
而為何會被稱為Single Sign On,如其名就是只需要登入一次。前面有提到auth code會被儲存於前端的cookie,這個auth code會有一個expire time,只要檢測還沒有到期都可以不用登入就獲取到用戶資訊,這大幅降低用戶登入需要花費的時間。
而如果不靠Social Network要如何為自己的系統實作SSO呢? 目前比較熱門的Open Source有 Gluu, Identity Server, Keycloak這幾個方案,之後預計會出一篇使用Keycloak實作SSO的文章,還請敬請期待(ノ>ω<)ノ。
Conclusion
今天簡單介紹了一下幾種Authentication方法,如果你是對外的服務,並且不想要自己維護與管理用戶資料,推薦使用 Social Login。如果你內部使用的話,推薦可以使用 SSO 的開源解決方案,在具備完全性的前提下,又可以提升作業效率。那這篇就先這樣,各位bye bye。
Leave a Reply