JWT(JSON Web Token)是一种开放标准,它允许将信息作为 JSON 对象进行安全地传输。JWT 在身份验证和授权应用程序中得到广泛使用。Node.js 提供了各种库和模块来实现 JWT,包括 jsonwebtoken 和 express-jwt。下面是使用 Node.js 实现 JWT 的过程步骤。
步骤1:安装所需库
首先,我们需要安装所需的依赖库,包括jsonwebtoken和express。在终端中使用以下命令来安装这些库:
npm install --save jsonwebtoken express
步骤2:创建 JWT
接下来,我们需要使用 jsonwebtoken 库创建 JWT。JWT 包含三个部分:头部、载荷和签名。这些部分使用 Base64 编码,其中头部和载荷使用 Base64Url 编码。
下面是一个示例,使用 Node.js 生成 JWT:
const jwt = require('jsonwebtoken');
const secret = 'mysecretkey';
const payload = { name: 'John Doe', email: 'johndoe@example.com' };
const token = jwt.sign(payload, secret, { expiresIn: '1h' });
console.log(token);
在这个示例中,我们创建了一个名为 payload 的包含姓名和电子邮件的对象,然后使用 jsonwebtoken 库的 sign()
方法生成 JWT。其中,secret
是加密密钥,expiresIn
参数指定 JWT 的过期时间。运行时应当输出如下所示的 JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2MTI1NjEwMDIsImV4cCI6MTYxMjU2NDYwMiwibmFtZSI6IkpvaG4gRG9lIiwiZW1haWwiOiJqb2huZG9lQGV4YW1wbGUuY29tIn0.2QpWESw6fJlCVOIb0oeN9u3vPjQJql9-vi-wyg7iF7s
如果需要解码 JWT,我们可以使用 jwt.decode()
方法:
const decodedToken = jwt.decode(token);
console.log(decodedToken);
这将输出以下内容:
{
iat: 1612561002,
exp: 1612564602,
name: 'John Doe',
email: 'johndoe@example.com'
}
步骤3:验证 JWT
在使用 JWT 进行身份验证时,我们需要验证 JWT 是否正确,这可以通过检查签名来完成。我们可以使用 jsonwebtoken 库的 verify()
方法来验证 JWT,如下所示:
const verifiedToken = jwt.verify(token, secret);
console.log(verifiedToken);
如果 JWT 验证成功,则会输出与解码相同的内容:
{
iat: 1612561002,
exp: 1612564602,
name: 'John Doe',
email: 'johndoe@example.com'
}
示例1:使用 JWT 进行身份验证
下面是一个示例,使用 JWT 进行身份验证:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());
const users = [
{ id: 1, username: 'johndoe', password: 'password123' },
{ id: 2, username: 'janedoe', password: 'password456' }
];
const secret = 'mysecretkey';
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (token == null) return res.sendStatus(401);
jwt.verify(token, secret, (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user == null) return res.sendStatus(401);
const token = jwt.sign({ username: user.username }, secret);
res.json({ token });
});
app.get('/protected', authenticateToken, (req, res) => {
res.json({ message: `Hello, ${req.user.username}!` });
});
在该示例中,我们使用 Express 建立一个简单的应用程序。该程序分为三个部分:
- 通过调用
jwt.sign()
创建 JWT。 - 通过在请求头中包含 JWT,使用
authenticateToken()
进行身份验证。 - 在成功验证后,使用
req.user
输出受保护的信息。
我们可以使用 Postman 或类似工具发送 POST 请求到 /login
路径进行登录操作,并发送 GET 请求到 /protected
路径查看受保护信息。
示例2:在 Express.js 中使用中间件
我们也可以在 Express.js 中使用 jsonwebtoken
库提供的中间件进行身份验证,如下所示:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());
const users = [
{ id: 1, username: 'johndoe', password: 'password123' },
{ id: 2, username: 'janedoe', password: 'password456' }
];
const secret = 'mysecretkey';
function generateToken(user) {
return jwt.sign({ id: user.id, username: user.username }, secret);
}
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (token == null) return res.sendStatus(401);
jwt.verify(token, secret, (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user == null) return res.sendStatus(401);
const token = generateToken(user);
res.json({ token });
});
app.get('/protected', authenticateToken, (req, res) => {
res.json({ message: `Hello, ${req.user.username}!` });
});
app.listen(3000, () => console.log('Server running on port 3000'));
在该示例中,我们使用 Express 中提供的中间件机制,将验证逻辑封装到 authenticateToken()
函数中,并将其作为中间件应用于路由。如果用户有足够的权限,即带有有效的 JWT,中间件将允许请求继续到路由处理程序。通过这种方式,我们可以轻松地在整个应用程序中重用身份验证逻辑。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.JS如何实现JWT原理 - Python技术站