Advertisement
  1. Code
  2. Node.js

使用 Passport 驗證 Node.js 應用程序

by
Read Time:11 minsLanguages:

Chinese (Traditional) (中文(繁體)) translation by Fuhuan (you can also view the original English article)

為任何應用程序實現身份驗證功能都是壹項艱巨的任務,Node.js 應用程序也不例外。

在本教程中,我們將從頭開發壹個 Node.js 應用程序並使用壹個相對較新但非常流行的身份驗證插件 - Passport 來處理我們的身份驗證問題。

Passport 的文檔將其描述為 “Node 的簡單,不顯眼的身份驗證插件”,這是正確的。

通過將自身作為插件提供,Passport 在將 Web 應用程序的其他問題與其身份驗證需求分離方面做得非常出色。 它允許將 Passport 輕松配置到任何基於 Express 的 Web 應用程序中,就像我們配置其他 Express 插件壹樣,例如日誌記錄,正文解析,cookie 解析,會話處理等。

本教程假設妳對 Node.js 和 Express 框架有基本的了解,並嘗試將註意力集中在身份驗證上,盡管我們從頭開始創建示例 Express 應用程序並通過向其添加路由並驗證其中壹些路由信息來進行。

認證策略

Passport 為我們提供了 140 多種身份驗證機制可供選擇。 妳可以針對本地 / 遠程數據庫實例進行身份驗證,或使用 OAuth 提供程序對 Facebook,Twitter,Google 等進行單點登錄,以對妳的社交媒體帳戶進行身份驗證,或者妳可以從支持身份驗證的廣泛提供商列表中進行選擇使用 Passport 並為其提供節點模塊。

但不要擔心:妳不需要包含應用程序不需要的任何策略 / 機制。 所有這些策略是相互獨立的,並打包為單獨的節點模塊,默認情況下,在安裝 Passport 的插件時不包括這些模塊:npm install passport

在本教程中,我們將使用 Passport 的本地身份驗證策略,並針對本地配置的 Mongo 數據庫實例對用戶進行身份驗證,並將用戶詳細信息存儲在數據庫中。 要使用本地身份驗證策略,我們需要安裝 passport-local 模塊:npm install passport-local

但是:在啟動終端並開始執行這些命令之前,讓我們從頭開始構建壹個 Express 應用程序並添加壹些路由(用於登錄,註冊和主頁),然後嘗試添加我們的身份驗證插件。 請註意,我們將在本教程中使用 Express 4,但稍微有些不同, Passport 也可以與 Express 3 壹起使用。

設置應用程序

如果妳還沒有,那麽請繼續安裝 Express&express-generator,通過在終端上執行 express passport-mongo 來生成樣板應用程序。  生成的應用程序結構應如下所示:

Initial Application StructureInitial Application StructureInitial Application Structure

讓我們刪除壹些我們不會使用的默認功能 - 繼續並刪除 users.js 路由並從 app.js 文件中刪除它的引用。

添加項目依賴項

將依賴項安裝並保存到 package.json 的另壹種方法是輸入:

由於我們將在 MongoDB 中保存用戶詳細信息,因此我們將使用 Mongoose 作為對象數據建模工具。 將依賴項安裝並保存到 package.json 的另壹種方法是輸入:

package.json 應如下所示:

Added Mongoose DependenciesAdded Mongoose DependenciesAdded Mongoose Dependencies

現在,安裝所有依賴項並通過執行 npm install && npm start 運行樣板應用程序。 現在,安裝所有依賴項並通過執行 npm install && npm start 運行樣板應用程序。 妳可以在 http:// localhost:3000 / 查看基本的 Express 應用程序,但現在沒有什麽看頭。

很快,我們將通過創建壹個完整的應用程序來改變這壹點,該應用程序要求顯示新用戶的註冊頁面,註冊用戶的登錄,並使用 Passport 對註冊用戶進行身份驗證。

創建 Mongoose 模型

由於我們將在 Mongo 中保存用戶詳細信息,因此我們在 Mongoose 中創建壹個用戶模型,並將其保存在我們的應用程序中的 models / user.js 中。

基本上,我們正在創建壹個 Mongoose 模型,使用它我們可以在底層數據庫上執行 CRUD 操作。

配置 Mongo

如果妳沒有在本地安裝 Mongo,我們建議妳使用雲數據庫服務,例如 Modulus 或 MongoLab。  使用這些實現創建壹個有效的 MongoDB 實例不僅是免費的,而且只需點擊幾下即可。

在其中壹個服務上創建數據庫後,它將為妳提供數據庫 URI,如 mongodb:// : @ novus.modulusmongo.net:27017 / ,可用於執行 CRUD 操作在數據庫上。 最好將數據庫配置保存在壹個單獨的文件中,該文件可以在需要時啟動。 因此,我們創建壹個節點模塊 db.js,它看起來像:

如果妳像我壹樣,妳正在使用本地 Mongo 實例,那麽可以啟動 mongod 守護進程了,db.js 應該看起來像

現在我們在 app.js 中使用此配置並使用 Mongoose API 連接到它:

配置 Passport

Passport 只提供了處理身份驗證的機制,留下了自己實現會話處理的責任,為此我們將使用快速會話。 在配置路由之前打開 app.js 並粘貼下面的代碼:


這是必要的,因為我們希望我們的用戶會話本質上是持久的。 在運行應用程序之前,我們需要安裝 express-session 並將其添加到 package.json 中的依賴項列表中。 要做到這壹點,請鍵入 npm install --save express-session

序列化和反序列化用戶實例

Passport 還需要從會話存儲中序列化和反序列化用戶實例以支持登錄會話,以便每個後續請求都不包含用戶憑據。 它為此提供了兩個方法 serializeUser 和 deserializeUser:

使用 Passport 策略

我們現在將定義 Passport 處理登錄和註冊的策略。 它們中的每壹個都是 Passport 的本地身份驗證策略的實例,並且將使用 passport.use()創建  功能。 我們使用 connect-flash 通過提供可以在出錯時顯示給用戶的 flash 消息來幫助我們處理錯誤。

登錄策略

登錄策略如下所示:

passport.use()的第壹個參數是策略的名稱,該策略將在以後應用時用於標識此策略。 第二個參數是妳要創建的策略類型,這裏我們使用用戶名密碼或 LocalStrategy。 需要註意的是,默認情況下,LocalStrategy 希望在用戶名和密碼參數中找到用戶憑據,但它允許我們使用任何其他命名參數。 所述 passReqToCallback 配置變量允許我們訪問的請求的回叫對象,從而使我們能夠使用與該請求相關聯的任何參數。

接下來,我們使用 Mongoose API 在我們的基礎用戶集合中查找用戶,以檢查用戶是否是有效用戶。 我們的回調中的最後壹個參數:done 表示壹個有用的方法,使用它可以向 Passport 模塊發出成功或失敗的信號。 要指定失敗,第壹個參數應該包含錯誤,或者第二個參數應該計算為 false。 為了表示成功,第壹個參數應為 null,第二個參數應評估為 truthy 值,在這種情況下,它將在請求對象上可用

由於密碼本質上是弱的,我們應該在將它們保存到數據庫之前對它們進行加密。 為此,我們使用 bcrypt-nodejs 來幫助我們加密和解密密碼。

如果妳對代碼片段感到不安並希望看到完整的代碼,請隨時在此處瀏覽代碼。

註冊策略

現在,我們定義下壹個策略,該策略將處理新用戶的註冊並在我們的基礎 Mongo DB 中創建他或她的條目:

在這裏,我們再次使用 Mongoose API 來查找是否已存在具有給定用戶名的任何用戶。  如果沒有,則創建壹個新用戶並將用戶信息保存在 Mongo 中。 否則使用完成回調和 flash 消息返回錯誤。 請註意,我們使用 bcrypt-nodejs 在保存之前創建密碼的哈希:

創建路由

如果我們看到我們的應用程序的鳥瞰圖,它看起來像:

Birds Eye View of Our ApplicationBirds Eye View of Our ApplicationBirds Eye View of Our Application

我們現在在以下模塊中定義應用程序的路由,該模塊采用在上面的 app.js 中創建的 Passport 實例。將此模塊保存在 routes / index.js 中 將此模塊保存在 routes / index.js 中

上面代碼片段中最重要的部分是使用 passport.authenticate() 在分別對 / login 和 / signup 路由進行 HTTP POST 時,將身份驗證委派給登錄和註冊策略。 請註意,不必在路徑路徑上命名策略,並且可以將其命名為任何名稱。

創建主視圖

接下來,我們為應用程序創建以下兩個視圖:

  1. layout.jade 包含基本布局和樣式信息
  2. index.jade 包含登錄頁面,其中包含登錄表單並提供創建新帳戶的選項

感謝 Bootstrap,我們的登錄頁面現在看起來像

Login Page for Our Passport AppLogin Page for Our Passport AppLogin Page for Our Passport App

我們還需要兩個註冊詳細信息和應用程序主頁的視圖:

  1. register.jade 包含註冊表單
  2. home.jade 說妳好,並顯示登錄用戶的詳細信息

如果妳不熟悉 Jade,請查看文檔。

實現註銷功能

作為插件的 Passport 被允許在請求和響應對象上添加某些屬性和方法,並通過添加非常方便的 request.logout()來正確使用它。  使用戶會話與其他屬性無效的方法。

保護路線

Passport 還能夠保護對被認為不適合匿名用戶的路由的訪問。 這意味著如果某個用戶嘗試訪問 http:// localhost:3000 / home 而未在應用程序中進行身份驗證,則他將通過執行重定向到主頁

結論

Passport 並不是這個領域中唯壹壹個認證 Node.js 應用程序的插件,而且還有像 EveryAuth 這樣的替代品,但模塊化,靈活性,社區支持以及它只是壹個插件使 Passport 絕對是壹個更好的選擇。

關於兩者之間的詳細比較,這是 Passport 自己的開發人員的壹個有趣的看法。

关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.