摘要:本文轉(zhuǎn)載自眾成翻譯譯者網(wǎng)絡(luò)埋伏紀事鏈接原文本教程中將學(xué)習(xí)如何使用和實現(xiàn)一個本地身份驗證策略。我們將有一個用戶頁,一個備注頁,和一些與身份驗證相關(guān)的功能。下一步下一章主要涉及應(yīng)用程序的單元測試。你會學(xué)習(xí)單元測試測試金字塔測試替代等概念。
本文轉(zhuǎn)載自:眾成翻譯
譯者:網(wǎng)絡(luò)埋伏紀事
鏈接:http://www.zcfy.cc/article/1755
原文:https://blog.risingstack.com/node-hero-node-js-authentication-passport-js/
本教程中將學(xué)習(xí)如何使用 Passport.js 和 Redis 實現(xiàn)一個本地 Node.js 身份驗證策略。
要使用的技術(shù)在一頭扎進實際代碼之前,我們先看看本章中要用到的新技術(shù)。
Passport.js 是什么?簡單、 不花哨的 Node.js 身份驗證 - passportjs.org
Passport 是一個 Node.js 身份認證中間件,我們將把它用于會話管理。
Redis 是什么?Redis 是一個開源的(BSD 許可)、內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)倉庫,被用作數(shù)據(jù)庫、緩存和消息代理中間件 - redis.io。
我們打算把用戶的會話信息存到 Redis 中,而不是在會話過程的內(nèi)存中。通過這種方式,我們的應(yīng)用程序會更容易擴展一些。
演示應(yīng)用出于演示目的,下面我們創(chuàng)建一個只做如下事情的應(yīng)用程序:
顯示一個登錄表單,
顯示兩個受保護頁面:
概述(profile)頁面,
secured notes
項目結(jié)構(gòu)在前一章你已經(jīng)學(xué)習(xí)了如何組織 Node.js 項目的結(jié)構(gòu),所以下面我們就開始用所學(xué)的知識!
我們打算采用如下結(jié)構(gòu):
├── app | ├── authentication | ├── note | ├── user | ├── index.js | └── layout.hbs ├── config | └── index.js ├── index.js └── package.json
正如你所見,我們會圍繞著功能來組織文件和目錄。我們將有一個用戶頁,一個備注頁,和一些與身份驗證相關(guān)的功能。
Node.js 身份驗證流程完整的代碼下載在 https://github.com/RisingStack/nodehero-authentication。*
我們的目標是實現(xiàn)如下的身份驗證流程到我們的應(yīng)用程序中:
用戶輸入姓名和密碼
應(yīng)用程序檢查是否匹配
如果匹配,就發(fā)送一個 Set-Cookie 響應(yīng)頭,用它來驗證之后的頁面
當用戶從同一域訪問頁面時,之前設(shè)置的 cookie 會被添加到所有的請求中
用這個 cookie 驗證受限制的頁面
為設(shè)置像這樣的身份驗證策略,請遵循如下三個步驟:
第一步:設(shè)置 Express我們打算用 Express 作為服務(wù)器框架 - 可以通過閱讀我們的 Express 教程,來學(xué)習(xí)更多關(guān)于此主題的知識。
// file:app/index.js const express = require("express") const passport = require("passport") const session = require("express-session") const RedisStore = require("connect-redis")(session) const app = express() app.use(session({ store: new RedisStore({ url: config.redisStore.url }), secret: config.redisStore.secret, resave: false, saveUninitialized: false })) app.use(passport.initialize()) app.use(passport.session())
在這里我們做了什么?
首先,我們 require 了所有會話管理所需的依賴。之后,我們從 express-session 模塊創(chuàng)建了一個新的實例,用它來存儲會話。
為后備存儲,我們用了 Redis。但是,你可以使用任何其它數(shù)據(jù)庫,比如 MySQL 或者 MongoDB。
第二步:設(shè)置 Node.js PassportPassport 是使用插件的一個很好的示例庫。對于本教程,我們添加 passport-local 模塊,該模塊讓我們可以很容易集成使用用戶名和密碼的簡單本地身份驗證策略。
為簡單起見,在本例中,我們沒有使用第二個后備存儲,只用了一個內(nèi)存中的 user 實例。在真實應(yīng)用程序中,findUser 會在數(shù)據(jù)庫中查找一個用戶。
// file:app/authenticate/init.js const passport = require("passport") const LocalStrategy = require("passport-local").Strategy const user = { username: "test-user", password: "test-password", id: 1 } passport.use(new LocalStrategy( function(username, password, done) { findUser(username, function (err, user) { if (err) { return done(err) } if (!user) { return done(null, false) } if (password !== user.password ) { return done(null, false) } return done(null, user) }) } ))
一旦 findUser 返回 user 對象,剩下的唯一的事情是比較提供的用戶以及真實密碼,看看是否匹配。
如果匹配,就讓用戶進入(通過將用戶返回給 passport - return done(null, user));如果不匹配,就返回一個未授權(quán)錯誤(通過什么都不返回給 passport - return done(null))。
第三步:添加受保護的端點要添加受保護的端點,就得利用 Express 所用的中間件模式。為此,先創(chuàng)建身份驗證中間件:
// file:app/authentication/middleware.js function authenticationMiddleware () { return function (req, res, next) { if (req.isAuthenticated()) { return next() } res.redirect("/") } }
這段代碼有一個作用,就是如果用戶被驗證(有正確的 cookies),就調(diào)用下一個中間件;否則就重定向到用戶登錄頁面。
用這種方式與把新中間件添加到路由定義一樣簡單。
// file:app/user/init.js const passport = require("passport") app.get("/profile", passport.authenticationMiddleware(), renderProfile)總結(jié)
在本教程中,你已經(jīng)學(xué)習(xí)了如何給應(yīng)用程序添加基礎(chǔ)的身份驗證。之后,就可以用不同的身份驗證策略擴展它,比如 Facebook 或 Twitter。在 http://passportjs.org/ 上可以找到更多策略。
完整的示例代碼放在 GitHub 上,你可以看看這里:https://github.com/RisingStack/nodehero-authentication。
下一步下一章主要涉及 Node.js 應(yīng)用程序的單元測試。你會學(xué)習(xí)單元測試、測試金字塔、測試替代等概念。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85168.html
摘要:本教程會學(xué)習(xí)如何正確組織一個項目的結(jié)構(gòu),從而在應(yīng)用程序開始增長時避免混亂。項目結(jié)構(gòu)的五個基本規(guī)則組織項目有不少可能的方式并且每種已知的方式都有其興衰。過去在,我們有機會創(chuàng)建各種規(guī)模的高效應(yīng)用程序,也獲得了大量關(guān)于項目結(jié)構(gòu)注意事項的見解。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀事鏈接:http://www.zcfy.cc/article/1756原文:https://blog.rising...
摘要:使用一個事件驅(qū)動的非阻塞式的模型,讓它輕量而高效。也就是說提供了用編寫服務(wù)器的可能性,這種服務(wù)器具有令人難以置信的性能。正如官方聲明所說是一個使用與瀏覽器相同引擎的運行時。這意味著有兩個發(fā)布版本穩(wěn)定版和試驗版。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀事鏈接:http://www.zcfy.cc/article/1748原文:https://blog.risingstack.com/nod...
摘要:則是目前比較成熟的一套互聯(lián)網(wǎng)應(yīng)用程序的設(shè)計理論。則允許操作,不一樣,報錯返回或者加入黑名單。再看下我們的數(shù)據(jù)庫中的用戶信息,值也被存入了進來,便于我們之后進行權(quán)限驗證。訪問同時將我們的值在中以傳入正確獲得用戶名則表示我們訪問請求通過了驗證。 showImg(https://segmentfault.com/img/remote/1460000008629635?w=800&h=534)...
摘要:則是目前比較成熟的一套互聯(lián)網(wǎng)應(yīng)用程序的設(shè)計理論。則允許操作,不一樣,報錯返回或者加入黑名單。再看下我們的數(shù)據(jù)庫中的用戶信息,值也被存入了進來,便于我們之后進行權(quán)限驗證。訪問同時將我們的值在中以傳入正確獲得用戶名則表示我們訪問請求通過了驗證。 showImg(https://segmentfault.com/img/remote/1460000008629635?w=800&h=534)...
摘要:是一種設(shè)計用于關(guān)系型數(shù)據(jù)庫的查詢語言。另一方面,數(shù)據(jù)庫在最近十年變得相當流行。大多數(shù)數(shù)據(jù)庫都有驅(qū)動程序可以用,它們在上也有庫。我們已經(jīng)完成了在中使用數(shù)據(jù)庫所必須知道的所有基礎(chǔ)知識。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀事鏈接:http://www.zcfy.cc/article/1751原文:https://blog.risingstack.com/node-js-database-t...
閱讀 1272·2021-10-18 13:32
閱讀 2348·2021-09-24 09:47
閱讀 1333·2021-09-23 11:22
閱讀 2469·2019-08-30 14:06
閱讀 577·2019-08-30 12:48
閱讀 2007·2019-08-30 11:03
閱讀 544·2019-08-29 17:09
閱讀 2470·2019-08-29 14:10