Module 03 · Express Web Application FrameworkExpress Web 应用框架
Authentication and Authorization in Node.jsNode.js 中的身份验证与授权
🎥 视频目标:
在本视频中,您将能够:
- 描述身份验证的必要性,以及它如何在 Node.js 中验证用户身份。
- 解释基于会话的身份验证,包括会话 ID 的创建、存储和销毁;并对比令牌认证和无密码认证,重点介绍 JWT(JSON Web Tokens)和公私钥对的使用。
身份验证与授权的重要性
想象一下,您正在设计一个基于 Node.js 的电商平台,用户可以注册并进行购买。然而,您意识到平台的身份验证和授权机制不够强大,用户数据可能面临风险,未授权访问变得可能。
这种情况可能导致严重后果,如数据泄露和客户信任丧失。如何避免这种情况?
了解 Node.js 中的身份验证和授权概念对于确保用户身份验证、保护敏感数据以及提升应用的可靠性和用户满意度至关重要。
身份验证(Authentication)
身份验证是指通过验证用户的凭证来确认其身份。这是确保应用安全的基本步骤,使得只有经过授权的用户才能访问系统的某些部分。
应用的后端负责处理这一验证过程。
1.常见的身份验证方法
Node.js 中常见的身份验证方法包括:
- 基于会话的身份验证
- 基于令牌的身份验证
- 无密码认证
接下来,我们将详细探讨这些方法。


基于会话的身份验证
基于会话的身份验证是最早的方法之一,工作流程如下:
- 用户登录并提供凭证,凭证会与数据库中存储的可访问资源进行验证。
- 如果凭证有效,服务器会创建一个加密的唯一会话 ID,并将其存储在数据库和浏览器的 Cookie 中。
- 当用户登出或会话过期时,会话 ID 会被销毁,用户会同时从浏览器和数据库中登出。

代码示例:会话身份验证(Express 应用)
- 设置 Express 应用并配置会话管理。
- 配置 Express 会话中间件,使用密钥加密会话数据,设置
resave和saveUninitialized等选项。 - 处理登录请求,验证用户名和密码,如果匹配,则将用户名存储在会话中。
- 检查用户是否通过身份验证,如果通过验证,显示欢迎消息,否则提示用户登录。




基于令牌的身份验证
基于令牌的安全性包含两个关键概念:
- 身份验证:提供凭证并接收一个令牌,验证用户凭证。
- 授权:使用令牌访问资源,确保资源服务器知道用户被授权访问哪些资源。

令牌的结构
令牌通常采用 JSON Web Tokens(JWT)格式,包含三个部分:
- Header:包含令牌类型和使用的算法。
- Payload:包含用户的属性,称为声明(Claims),如权限和过期时间。
- Signature:用来验证令牌的完整性。

令牌身份验证流程
- 浏览器请求访问 Web 应用。
- 身份验证服务器响应一个 ID 令牌,客户端将其存储为加密的 Cookie,并随请求发送给 Web 服务器。
- Web 服务器验证该令牌,授权用户访问。

基于令牌的授权
基于令牌的授权是指,Web 应用请求访问受保护的资源(如 API)。在此过程中:
- 用户在授权服务器上进行身份验证。
- 授权服务器生成访问令牌,发送回客户端并存储。
- 每次 HTTP 请求时,令牌会被传递给资源 API 服务器,携带权限信息,免去每次查询授权服务器的需求。
- 即使令牌被盗,由于加密的原因,凭证信息不会暴露。

代码示例:令牌身份验证(Express 应用)
- 配置 Express 应用并添加中间件(如 BodyParser)来解析 JSON 请求。
- 处理用户登录的 POST 请求,若凭证有效,生成一个包含用户名的 JWT。
- 检查请求的授权头中是否包含 JWT。如果存在,验证令牌并提取用户名,授权访问。



无密码认证(Passwordless Authentication)
无密码认证不使用传统的密码,而是采用生物识别、通过电子邮件发送的神奇链接或发送到移动设备的一次性验证码等方法。这种方式通常用于密码恢复系统。
公私钥加密
- 在注册时,设备生成一个与身份关联的公私钥对。
- 公钥用于加密数据,任何人都可以访问;私钥则安全存储在设备上,用于解密数据。
- 在登录时,应用生成一个登录挑战,使用公钥加密,并通过私钥解密以授权访问。


代码示例:无密码认证(Express 应用)
- 设置 Express 应用并使用中间件(如 BodyParser)来解析 JSON 请求。
- 处理 POST 请求,用户提供邮箱以请求访问,生成一个六位数验证码并存储在内存中。
- 处理 POST 请求,验证收到的验证码是否与存储的验证码匹配。如果匹配,则授权访问,否则拒绝访问。



总结
在本视频中,您学习了:
- 身份验证:通过凭证验证身份,确认用户身份。
- 基于会话的身份验证:通过凭证创建会话 ID 存储在数据库和浏览器中,登出时销毁会话 ID。
- 基于令牌的身份验证:使用令牌(通常为 JWT)在服务器和客户端之间传递数据,令牌中包含用户的身份和权限信息。
- 无密码认证:使用公私钥对加密和解密数据,而无需传统密码。
掌握这些身份验证与授权机制,可以帮助您构建更加安全和高效的 Web 应用!