什么是 JWT?
JWT(JSON Web Token)是一种轻量级的身份验证机制,它是基于 JSON 格式的标准化令牌。JWT 通常由三部分组成:头部、载荷和签名。头部包含令牌的类型和签名算法;载荷包含 JWT 所表示的用户信息;签名根据头部和载荷计算得到。JWT 的优势是令牌可以被客户端和服务器轻松传递,并且被签名后可以确保其完整性和来源。
Express.js 中如何使用 JWT?
在使用 JWT 完成身份验证的过程中,需要在服务端和客户端分别完成两个步骤:生成 JWT 和验证 JWT。
生成 JWT
在 Express.js 中生成 JWT 可以使用 jsonwebtoken 模块。下面是一个使用 jsonwebtoken 模块生成 JWT 的示例代码:
const jwt = require('jsonwebtoken');
const user = { id: 123 };
const token = jwt.sign(user, 'this is my secret key', { expiresIn: '1h' });
console.log(token);在上述代码中,首先引入 jsonwebtoken 模块,并定义了一个包含用户信息的对象 user。然后调用 jwt.sign 方法生成 JWT,第一个参数是要转换为 JWT 的对象(通常为用户信息),第二个参数是用于签名的秘钥,第三个参数是可选参数,表示 JWT 的有效期。
验证 JWT
在 Express.js 中验证 JWT 可以使用 jsonwebtoken 模块。下面是一个使用 jsonwebtoken 模块验证 JWT 的示例代码:
// www.javascriptcn.com code example
const jwt = require('jsonwebtoken');
const secret = 'this is my secret key';
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTIzLCJpYXQiOjE2MTYyMzkwMjJ9.rZJx7rsQgJd9VcFxi8P_MWVzzv-yA1xDuV7QuY8M0ZI';
jwt.verify(token, secret, (error, decoded) => {
if (error) {
console.error(error.message);
} else {
console.log(decoded);
}
});在上述代码中,首先引入 jsonwebtoken 模块,并定义了一个用于签名的秘钥 secret 和一个 JWT token。然后调用 jwt.verify 方法验证 JWT,第一个参数是要验证的 JWT,第二个参数是用于签名的秘钥,第三个参数是回调函数,用于判断 JWT 是否有效。如果 JWT 有效,函数会解析出 JWT 中的用户信息。
最佳实践
在使用 JWT 完成身份验证的过程中,需要注意以下几点:
避免将敏感信息放入 JWT
JWT 被发送到客户端后,可以被解析得到其中的用户信息。因此,我们需要避免将敏感信息放入 JWT 中。
设置 JWT 的有效期
设置 JWT 的有效期可以保证 JWT 的过期后不能再使用。需要注意的是,有效期应该根据具体情况设置。
保护 JWT 的秘钥
秘钥是用于签名 JWT 的重要信息,需要妥善保管。
在调用 API 时验证 JWT
在服务端验证 JWT 可以有效的避免未授权访问。为了提高安全性,应该在每个需要验证身份的 API 上都进行 JWT 的验证。
示例代码
下面是一个使用 Express.js 和 JWT 完成身份验证的示例代码:
// www.javascriptcn.com code example
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const secret = 'this is my secret key';
app.use(express.json());
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 验证用户名和密码
if (username === 'admin' && password === 'admin') {
// 生成 JWT
const token = jwt.sign({ username }, secret, { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).json({ error: 'Unauthorized' });
}
});
function authenticate(req, res, next) {
const authHeader = req.get('Authorization');
if (!authHeader) {
res.status(401).json({ error: 'Unauthorized' });
} else {
const token = authHeader.replace('Bearer ', '');
// 验证 JWT
jwt.verify(token, secret, (error, decoded) => {
if (error) {
res.status(401).json({ error: 'Unauthorized' });
} else {
req.username = decoded.username;
next();
}
});
}
}
app.get('/profile', authenticate, (req, res) => {
res.json({ username: req.username });
});
app.listen(3000, () => {
console.log('Server started on port 3000');
});在上述代码中,首先引入 express 和 jsonwebtoken 模块,并定义了一个用于签名的秘钥 secret。然后使用 express.json() 中间件解析请求中的 JSON 数据。
在 /login 路径中,验证了用户名和密码后,生成 JWT 并返回给客户端。在 /profile 路径中,通过调用 authenticate 中间件验证 JWT,如果 JWT 有效则返回用户信息。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67ca5212e46428fe9e253693