繁體中文(香港)
  • auth
  • dev
  • authentication
  • authorization

你需要為應用程式建立自己的身份驗證嗎?

我見過很多開發者問類似“我應該為我的應用程式建立自己的身份驗證嗎?”的問題。雖然答案不能簡單地用 "是" 或 "否" 來回答,但我想寫一篇文章來解析如何實施,並展示利弊來幫助你決定。

Gao
Gao
Founder

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

背景

我見過很多開發者問類似“我應該為我的應用程式建立自己的身份驗證嗎?”的問題。雖然答案不能簡單地用 "是" 或 "否" 來回答,但我想寫一篇文章來解析如何實施,並展示利弊來幫助你決定。

懶人包 找到符合你需求的現有解決方案是必要的,除非你真的想要完全控制或你仍在學習軟件開發。

簡介

作為開發者,我在職業生涯中建立了許多應用程式。無論使用哪種編程語言,我總需要構建一個共同基礎:用戶身份驗證。

回到 20 年前,這部分幾乎可以忽略不計,因為一切都很簡單明瞭:

  • 實現一個用戶名和密碼的註冊和登入系統。
  • 創建一種機制來維持用戶的會話。
  • 有關安全性?MD5 就是答案。

就是這樣。然後我就可以專注於“真正的業務”。沒聽說過 MD5?那你錯過了軟件開發的“美好時光”。如今,開發人員在建立登入/註冊時面臨更多挑戰。

這聽起來有些危言聳聽,但讓我用一個例子來解釋。

例子:一個在線書店

假設你正在嘗試建立一個有 API 服務和網頁前端應用程式的在線書店。

首先,應該定義“身份驗證”的範圍。身份驗證可以解釋為身份確認和授權,它們有著完全不同的定義和使用情境:

我寫了一篇文章 CIAM 101: 身份驗證、身份、單一登入 來詳細討論這些概念。

選擇身份驗證方法

讓我們從“身份確認”開始,這是我們例子中的用戶登入部分。除了用戶名和密碼的方法,這裡有一些流行的方法,人們正在採用以獲得更好的用戶轉化和安全性:

  • 無密碼,即動態驗證碼(通過電郵或短信)
  • 社交登入(Google、Facebook 等)

方法的選擇取決於商業決策,我們可以看看技術方面的努力:

  • 對於無密碼,你需要找到一個供應商來通過電郵或短信發送驗證碼;然後整合到你的 API 服務中(可能需要新的 API)。
  • 對於社交登入,你必須遵循你希望使用的社交身份提供者的整合指南。此外,你必須在你的書店的用戶 ID 和身份提供者之間建立映射。
    • 例如,當用戶使用 Gmail 帳戶 [email protected] 登入時,你可以將這個電郵地址鏈接到書店的用戶 foo。這個過程幫助你構建統一的身份系統,並允許用戶在未來修改或取消他們的社交身份鏈接。

設計和實施登入體驗

在你決定身份驗證方法後,為你的最終用戶設計一個優雅和流暢的登入體驗是下一個目標。這裡的轉化對業務來說是根本但關鍵的,因為這是一種留下持久用戶數據的自然方式。

當我在 Airbnb 工作時,有一整個團隊專門負責對多個平台的登入體驗進行優化。他們進行了無數次 A/B 測試,以確定哪種組合具有最高的轉化率。

當業務處於起步階段時,這並不實際。但我們仍需要盡力使每一部分都正確。你想在哪些平台上運行書店?你可以從行動設備、網頁或二者同時開始。具體的設計將取決於你選擇的身份驗證方法:

  • 用戶名和密碼:最簡單的一種,只需若干輸入框和按鈕。
  • 無密碼:輸入電話 / 電郵,然後發送和驗證動態碼。
  • 社交登入:閱讀選擇的社交身份提供商的文檔,遵循視覺指引,處理重定向邏輯,最後將社交身份與書店身份鏈接。

更多的事項來讓它變得更好:

  • 你是否需要為特定方法合併註冊和登入過程?
  • 你是否需要一個“忘記密碼”的流程,以允許用戶獨立重置他們的密碼?

如果你選擇原生開發,那麼一個額外平台的工作量幾乎會加倍。

安全性和令牌交換

安全性可以是一個隱藏的冰山。如果你熟悉 OpenID Connect 或 OAuth 2.0,那就很棒,因為它們廣泛使用並經過考驗。OpenID Connect 相對較新,但專為“用戶身份驗證”設計,這對在線書店來說非常合適。

不深入標準的細節,仍然有一些事情需要考慮:

  • 應使用哪種加密方式處理密碼?
  • 標準的身份驗證和授權流程是什麼?
  • 令牌交換如何工作(訪問令牌,刷新令牌,ID 令牌等)?
  • 簽名字如何在令牌中使用,如何驗證簽名以保護資源?
  • 如何防止客戶端和服務器的攻擊?

最終,你可以實現一個良好的登入體驗並提供給客戶。

授權模型

作為一個書店,你需要分隔顧客和賣家的資源。例如,顧客可以瀏覽所有書籍,而賣家可以管理他們列出的書籍。如果-Else 的檢查可以作為開始,但隨著業務增長,你可能需要利用更靈活的模型,如基於角色的訪問控制(RBAC)或基於屬性的訪問控制(ABAC)。

我還寫了一篇文章 CIAM 102: 授權和基於角色的訪問控制 來展示基本的授權概念和 RBAC 模型。

作出決定

你可以看到身份驗證並不是一個“全有或全無”的問題,因為它涉及多個技術組件,而你或者你的團隊在這些領域可能擁有不同的技術專長。重要的是將其拆分成更小的部分,以便更好地了解當前狀況。

為了作出決定,我會問自己以下問題:

  • 項目有多緊急?
  • 我預計將多少精力投入到身份驗證中,而非業務中?
  • 用戶體驗、安全性和可維護性的優先級是什麼?
  • 哪個部分是我需要完全控制的?我應該對它們多熟悉?
  • 如果我使用框架或解決方案,它們的自定義能力或擴展性如何?
  • 如果業務增長,我是否需要引入新的身份驗證模型?
  • 如果我找到合適的供應商,它的安全性如何?萬一供應商出了問題,我是否需要一個撤出計劃?

想到這些問題後,我發現了兩個事實:

  • 打造一個可靠的身份驗證系統是非常複雜的。
  • 現有的供應商無法滿足所有必要的標準。

因此,我決定開始一個專門的項目(Logto)用於身份驗證,並從第一天起擁抱開源社群。

希望這篇文章對你有幫助。