Module 03 · Express Web Application FrameworkExpress Web 应用框架
Authentication in Node.jsNode.js 中的令牌身份验证与授权
🎥 视频目标:
在观看本视频后,您将能够:
- 讨论基于令牌的身份验证在 Node.js 中的优势。
- 在 Node.js 中实现基于令牌的身份验证与授权。
什么是身份验证?
身份验证是通过获取用户凭证并使用这些凭证来验证其身份的过程。身份验证旨在识别用户,并根据其身份提供相应的访问权限和内容。

身份验证方法
正如在其他视频中讨论的那样,身份验证可以通过以下方式实现:
- 基于会话的身份验证(Session-based Authentication)
- 基于令牌的身份验证(Token-based Authentication)
- 无密码身份验证(Passwordless Authentication)
基于令牌的身份验证 是 Node.js 中最流行的身份验证方法。接下来,我们将介绍基于令牌身份验证的一些优势。
基于令牌的身份验证的优势
- 可扩展性:令牌只需要存储在客户端,因此可以更轻松地扩展应用。
- 灵活性:令牌可以跨多个服务器使用,并能为多个网站和应用提供认证。
- 安全性:JWT(JSON Web Tokens)可以进行签名和加密,确保令牌不可篡改,且未经私钥加密无法被读取。

设置 Express.js API 服务器
让我们设置一个 Express.js API 服务器,为基于用户权限的员工信息提供访问。该应用将包括两个 API,每个 API 都有自己的端点:
- POST API 用于登录,返回一个 Web 令牌,发送用户名和密码作为请求体。
- GET API 作为资源端点,获取员工信息,只有已认证的用户才能访问。

代码示例:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());
app.get('/employees', (req, res) => {
res.status(401).send('Please login to access this resource');
});
app.listen(5000, () => {
console.log('API Server is localhost:5000');
});
此代码创建了一个 Web 服务器模块,通过调用 express() 函数并将其分配给常量 myapp。
myapp.get函数创建了一个 GET API 端点,用于员工 API,当前对该端点的任何调用都会返回 HTTP 状态码 401,表示“未授权”,并带有消息:“请登录以访问此资源”。
要执行该 API,首先保存文件并命名为 api-server.js,然后运行命令:

node api-server.js
允许用户登录并生成令牌
下一部分代码允许用户登录,并在用户名和密码正确时返回生成的经过验证的令牌。
注意:用户名和密码通常存储在数据库中,但由于本示例中不涉及数据库连接,我们将在代码中硬编码用户名为 "user" 和密码为 "password"。

代码:
const jwt = require('jsonwebtoken');
const secret = 'mysecretkey';
app.post('/signin', (req, res) => {
const { username, password } = req.body;
if (username === 'user' && password === 'password') {
const token = jwt.sign({ username }, secret);
res.json({ token });
} else {
res.status(401).send('Invalid username and/or password');
}
});
jsonwebtoken.sign()方法生成 JWT。- 返回的 JSON 响应中包含生成的令牌。
安装 jsonwebtoken 包:

npm install jsonwebtoken
要在本视频中显示代码,我们将硬编码用户名和密码。但是请注意,JWT Secret应该始终使用密码生成器生成,并作为环境变量存储在配置文件中,而不是硬编码在API中,如下所示。


基于令牌的授权
接下来,我们定义一个 GET API 方法,使用 Authorization Header 来验证 JWT 令牌,以访问员工信息。
如果请求头中没有找到令牌,则会返回状态码 401,消息为“没有令牌”。
代码:



app.get('/employees', (req, res) => {
const token = req.header('Authorization');
if (!token) {
return res.status(401).send('No Token');
}
try {
const decoded = jwt.verify(token, secret);
if (decoded.username === 'user') {
res.status(200).send('Access Successful to Employee Endpoint');
} else {
res.status(401).send('Invalid Token');
}
} catch (err) {
res.status(401).send('Invalid Token');
}
});
- 获取请求中的
Authorization头部,验证其包含的令牌。 - 如果令牌有效且用户名匹配,则返回 200 状态码,并授权访问员工 API。
API 服务器监听
最后,编写一个监听函数,监听 5000 端口,并在控制台打印消息:“API server is localhost:5000”。
总结
在本视频中,您学习了:
- 基于令牌的身份验证的优势:可扩展性、灵活性和安全性。
- POST API:用于用户登录,将凭证验证并生成 JWT 令牌。
- GET API:用于资源授权,确定用户可以访问哪些资源。
- JWT:用于认证用户并授权其访问特定资源。
通过使用基于令牌的身份验证,您可以构建更安全、灵活且可扩展的 Web 应用!