十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

freeCodeCamp 高级 Node 与 Express 实战:用 Passport 实现用户登出(/logout)与 404 兜底中间件

freeCodeCamp 高级 Node 与 Express 实战:用 Passport 实现用户登出(/logout)与 404 兜底中间件 freeCodeCamp 高级 Node 与 Express 实战用 Passport 实现用户登出/logout与 404 兜底中间件【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp在 freeCodeCamp 的 Advanced Node and Express 认证课程中Logging a User Out挑战文件 58965611f9fc0f352b528e6c.md是登录体系落地的关键一步它教你在基于 Express Passport express-session 的服务端应用中用一条/logout路由把用户从认证状态拉回未认证状态并顺手补齐 Node 项目中最常见的 404 兜底中间件。读完本文你将掌握 Passport 会话注销的完整流程、中间件注册顺序的重要性以及该挑战的测试用例是如何对你的server.js做源码级与行为级双重验证的。课程定位登出挑战在整个认证链中的位置根据课程结构文件 advanced-node-and-express.json这个 block 的 22 个挑战按如下顺序推进认证功能模板引擎PugSet up a Template Engine → Use a Template Engines PowersPassport 初始化Set up Passport → Serialization of a User Object → Implement the Serialization of a Passport User本地认证策略Authentication Strategies → How to Use Passport Strategies → Create New Middleware个人资料页How to Put a Profile Together登出Logging a User Out本文主题注册新用户的 Registration of New Users以及随后的 Hashing Your Passwordsbcrypt。也就是说当你做到本文对应的挑战时你的 Express 应用已经具备了express-session 会话客户端只保存 session id cookie个人账号数据留在服务端这是 Set up Passport 一课建立的安全模型、passport.authenticate(local)登录路由以及一个展示req.user.username的/profile页面。登出逻辑要做的就是对称地撤销这一切。核心实操一编写 /logout 路由注销会话原文档给出的实现非常简洁——路由只需把用户置为未认证然后重定向到首页而不是渲染任何视图。在 Passport 中注销用户就是在重定向前调用req.logout()app.route(/logout) .get((req, res) { req.logout(); res.redirect(/); });这段代码的工作机制可以拆成两层来理解req.logout()由passport.session()中间件挂载在req上的方法见 Set up Passport 中要求注册的app.use(passport.session())。调用它会销毁当前会话session destroy使服务端保存的登录态失效。res.redirect(/)随后把客户端重定向回首页。重定向之所以必要是因为如果直接渲染某个视图可能暴露仍属于登录用户的页面状态。与登录侧形成对称的是登录路由How to Use Passport Strategies通过passport.authenticate(local, { failureRedirect: / })认证成功后把用户对象写入req.user登出路由则用req.logout()清除会话。一个写入、一个清除构成了完整的认证生命周期。核心实操二为所有未匹配路由添加 404 兜底中间件原文档指出你可能注意到目前你的应用还没有处理页面不存在404的情况。在 Node/Express 中的常见做法是添加如下中间件——关键点是把它放在所有其他路由之后app.use((req, res, next) { res.status(404) .type(text) .send(Not Found); });这里有几个值得注意的技术细节注册顺序决定生效范围Express 按注册顺序执行路由与中间件。只有当请求没有被前面任何路由处理时才会落到这个兜底中间件上因此它必须最后注册链式响应res.status(404)设置状态码res.type(text)设置Content-Type响应头res.send(Not Found)写入响应体——三步链式调用返回的都是res自身这是 Express 响应对象的典型风格它也是错误处理链路的一环注意这里声明了next参数却不调用因为响应已经发出请求处理到此终止。这与课程前面Create New Middleware一课中通过next(err)传递错误的模式形成对照。与前后挑战的衔接登出如何融入完整用户体验登出不是孤立存在的路由它和前后挑战共同拼出完整的登录/登出闭环入口在个人资料页在 How to Put a Profile Together 一课中你已经在profile.pug里添加了指向/logout的链接a(href/logout) Logout并渲染了Welcome, #{username}!。因此用户点击该链接发起 GET 请求时就会命中本文的/logout路由并被弹回首页登出后/profile应不可访问由于/profile路由带有必须已认证的守卫未登录时重定向到首页req.logout()销毁会话之后再访问/profile就会被重定向回首页——这正是登出功能的正确行为而非 bug下一步是注册紧随其后的 Registration of New Users 会实现POST /register先findOne查重再insertOne入库然后复用passport.authenticate(local, { failureRedirect: / })完成注册即登录最后重定向到/profile并在此课中给出覆盖注册 → 登录 → 登出 → 登出后访问 /profile全链路的行为测试再之后的 Hashing Your Passwords 则用bcrypt.hashSync(req.body.password, 12)与bcrypt.compareSync替换明文密码存储。测试用例如何验证你的实现该挑战的--hints--部分即官方测试采用 freeCodeCamp 编辑器环境的通用做法通过new URL(/_api/server.js, code)拿到你在在线编辑器中的server.js源码文本做静态断言同时直接对运行中的应用发请求做行为断言。核心断言有两条断言 1源码中必须存在req.logout()调用const url new URL(/_api/server.js, code); const res await fetch(url); const data await res.text(); assert.match( data, /req.logout/gi, You should be calling req.logout() in your /logout route );断言 2GET /logout 之后用户应被重定向到首页const url new URL(/logout, code); const res await fetch(url); const data await res.text(); assert.match( data, /Home page/gi, When a user logs out they should be redirected to the homepage );第二条断言能穿透重定向断言到首页内容说明测试请求携带了凭据/会话信息同课程的 Registration of New Users 行为测试中$.ajax明确使用了xhrFields: { withCredentials: true }来保持会话并验证了Logout should redirect to home与Profile should no longer work after logout两条端到端性质。这也提醒我们/logout设计为 GET 路由是课程刻意选择——这样 Pug 模板里的a href/logout超链接可以直接触发登出无需额外的表单或 JS 提交。小结从这一课带走的东西在 Passport 体系中登出 在重定向前调用req.logout()路由本身不渲染任何视图res.redirect(/)把用户安全地送回公开页面404 兜底中间件是 Express 请求处理链的最后一道关卡必须注册在所有路由之后通过res.status(404).type(text).send(Not Found)链式调用完成响应结合课程上下文登录策略、会话初始化、profile 守卫、后续注册与 bcrypt 挑战可以推断出整个认证的进—守—出模型req.login()由passport.authenticate隐式完成写入会话/profile守卫读取会话req.logout()销毁会话官方测试同时验证源码里有req.logout和GET /logout 落到首页静态检查与行为检查并用——这是理解该课程所有挑战验收逻辑的一个缩影。如需在本地仓库中继续深入可对照 Logging a User Out 挑战文件、block 结构定义 advanced-node-and-express.json以及相邻挑战文件 Set up Passport、How to Put a Profile Together、Registration of New Users 查看完整认证流程的上下文。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表