Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Node.js
Code

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

by
Difficulty:IntermediateLength:LongLanguages:

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 Structure

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

添加項目依賴項

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

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

package.json 應如下所示:

Added 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 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 App

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

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

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

實現註銷功能

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

保護路線

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

結論

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

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

Envato qr branded
关注我们的公众号
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.