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