檢視原始碼 mix phx.gen.auth

mix phx.gen.auth 指令會在您的 Phoenix 應用程式中產生一個靈活、預建的驗證系統。此產生器讓您可以快速完成在程式碼庫中加入驗證的任務,專注於您的應用程式嘗試解決的實際問題。

開始使用

在執行此指令之前,請考慮提交您的工作,因為它會產生多個檔案。

讓我們從應用程式的根目錄(或雨傘應用程式中的 apps/my_app_web)執行下列指令開始

$ mix phx.gen.auth Accounts User users

An authentication system can be created in two different ways:
- Using Phoenix.LiveView (default)
- Using Phoenix.Controller only

Do you want to create a LiveView based authentication system? [Y/n] Y

驗證產生器支援 Phoenix LiveView,以增強 UX,因此我們會在這裡回答 Y。您也可以回答 n 以使用基於控制器的驗證系統。

任一種方法都會建立一個具有 Accounts.User 架構模組的 Accounts 上下文。最後一個引數是架構模組的複數版本,用於產生資料庫表格名稱和路由路徑。mix phx.gen.auth 產生器類似於 mix phx.gen.html,但它不接受新增至架構的其他欄位清單,而且會產生更多上下文函式。

由於此產生器在 mix.exs 中安裝了其他依賴項,因此讓我們提取它們

$ mix deps.get

現在,我們需要驗證 config/ 中開發和測試環境的資料庫連線詳細資料,以便遷移器和測試可以正確執行。然後執行以下內容,以建立資料庫

$ mix ecto.setup

讓我們執行測試,以確保我們的驗證系統可以如預期運作。

$ mix test

最後,讓我們啟動我們的 Phoenix 伺服器並試用看看。

$ mix phx.server

開發人員責任

由於 Phoenix 將此程式碼產生到您的應用程式中,而不是將這些模組建置到 Phoenix 本身,因此您現在可以完全修改驗證系統,以便最適合您的使用案例。使用產生的驗證系統的唯一警告是,產生後它將不會更新。因此,mix phx.gen.auth 的輸出經過改善後,您有責任確定需要將這些變更移植到您的應用程式中。與安全性相關的其他重要改進將明確標示在 CHANGELOG.md 檔案和升級說明中。

產生的程式碼

以下是關於產生的驗證系統的說明。

密碼雜湊

密碼雜湊機制預設為 Unix 系統的 bcrypt 和 Windows 系統的 pbkdf2。兩個系統都使用 Comeonin 介面

密碼雜湊機制可以用 --hashing-lib 選項覆寫。支援下列值:

我們建議開發人員考慮使用這 3 個選項中最健全的 argon2。缺點是 argon2 滿吃 CPU 和記憶體,執行您的應用程式需要更強大的實例。

如需更多關於選擇這些程式庫的資訊,請參閱 Comeonin 專案

禁止存取

產生的程式碼附帶一個驗證模組,其中包含一些用於擷取目前使用者、要求驗證等的插入元件。例如,在一個名為 Demo 的應用程式中,執行 mix phx.gen.auth Accounts User users,您會找到一個名為 DemoWeb.UserAuth 的模組,其中包含以下插入元件:

  • fetch_current_user - 如果有,擷取目前使用者的資訊
  • require_authenticated_user - 必須在 fetch_current_user 之後呼叫,並且要求目前使用者存在且已驗證
  • redirect_if_user_is_authenticated - 用於少數經過驗證的使用者無法使用的頁面

確認

已產生的功能包含帳戶確認機制,其中使用者必須確認他們的帳戶,通常是透過電子郵件。然而,已產生的程式碼無法禁止使用者在尚未確認他們的帳戶時使用應用程式。您可以在 Auth 模組中自訂 require_authenticated_user 來檢查 confirmed_at 欄位 (以及您所需的任何其他屬性),以加入此功能。

通知器

已產生的程式碼並未與任何系統整合,無法發送簡訊或電子郵件來確認帳戶、重設密碼等,而只是將訊息記錄在終端機。您有責任在產生後與適當的系統整合。

請注意,如果您透過 mix phx.new 產生 Phoenix 專案,您的專案便會設定為預設使用 Swoosh 郵件程式。如果您想在開發階段使用 Swoosh 觀看通知器電子郵件,請瀏覽至 /dev/mailbox

追蹤記錄階段

所有記錄階段和權杖都會追蹤在一個個別的表格中。這能讓您追蹤每個帳戶中有多少個活躍的階段。您甚至可以在需要時將這些資訊公開給使用者。

請注意,無論密碼透過重設密碼或直接方式變更,所有權杖都會被刪除,而使用者必須在所有裝置上重新登入。

使用者身分列舉攻擊

使用者身分列舉攻擊允許某人檢查電子郵件是否已在應用程式中註冊。已產生的驗證程式碼並未嘗試保護這些檢查。例如,當您註冊一個帳戶時,如果該電子郵件已註冊,程式碼將會通知使用者電子郵件已註冊。

如果您的應用程式容易受到列舉攻擊,您需要實作自己的工作流程,這通常與大多數應用程式大不相同,因為您需要謹慎平衡安全性與使用者體驗。

此外,如果您擔心列舉攻擊,也請提防時序攻擊。例如,與帳戶已存在時相比,註冊新帳戶通常會涉及額外的作業 (例如寫入資料庫、發送電子郵件等)。某人可以測量執行這些額外任務的時間來列舉電子郵件。這適用於所有可能發送電子郵件、應用程式內通知等的端點 (註冊、確認、密碼復原等)。

大小寫敏感性

電子郵件搜尋有大小寫不敏感的特性。在 MySQL 和 MSSQL 中,大小寫不敏感的搜尋是預設值。在 SQLite3 中,我們在欄位定義中使用 COLLATE NOCASE 來支援此特性。在 PostgreSQL 中,我們使用 citext extension

請注意,citext 是 PostgreSQL 本身的一部分,而且大多數作業系統和套件管理員都會將它與 PostgreSQL 綁在一起。mix phx.gen.auth 會負責建立 extension,在大部分情況下不需要額外執行工作。不過,如果你的套件管理員將 citext 分割成一個獨立的套件,你可能會在執行遷移時收到錯誤訊息,而且非常有可能是安裝 postgres-contrib 套件就能解決這個問題。

同時進行的測試

如果你使用的資料庫支援同時執行的測試,測試就會同時執行。支援同時測試的資料庫包括 PostgreSQL。

關於 mix phx.gen.auth 的詳細資訊

請查看 mix phx.gen.auth,以瞭解更多詳細資訊,例如使用不同的密碼雜湊函式庫、自訂 Web 模組命名空間、產生二進位 Id 類型、設定預設選項,以及使用自訂表名稱。

其他資源

以下連結提供了更多資訊,說明此程式碼產生的動機和設計。