JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为JSON对象。JWT通常用于身份验证和信息交换。双重身份验证器是指除了用户名和密码之外,还需要第二种形式的验证,以提高安全性。
JWT通常由三部分组成:
.
连接它们,最后用.
连接它们,然后用Header中声明的加密方式进行加密,例如:.
连接它们,最后用.
连接它们,然后用Header中声明的加密方式进行加密,例如:JWT广泛应用于Web应用的身份验证,如用户登录、API访问控制等。
首先,你需要安装jsonwebtoken
和bcryptjs
:
npm install jsonwebtoken bcryptjs
以下是一个简单的示例,展示了如何在Express应用中实现JWT双重身份验证:
const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const app = express();
app.use(express.json());
// 模拟用户数据库
const users = [
{ id: 1, username: 'user1', password: '$2a$10$L.XAIqIWgkOzXv.xoW5lG.q1P3u6eYhZzJ9X8s5YhZzJ9X8s5YhZ' } // password: 'password1'
];
// 登录路由
app.post('/login', async (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username);
if (!user) {
return res.status(400).send('User not found');
}
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(400).send('Invalid password');
}
// 生成JWT
const token = jwt.sign({ id: user.id }, 'your_jwt_secret', { expiresIn: '1h' });
res.json({ token });
});
// 受保护的路由
app.get('/protected', verifyToken, (req, res) => {
jwt.verify(req.token, 'your_jwt_secret', (err, authData) => {
if (err) {
res.sendStatus(403);
} else {
res.json({ message: 'Protected content', authData });
}
});
});
// JWT验证中间件
function verifyToken(req, res, next) {
const bearerHeader = req.headers['authorization'];
if (typeof bearerHeader !== 'undefined') {
const bearerToken = bearerHeader.split(' ')[1];
req.token = bearerToken;
next();
} else {
res.sendStatus(403);
}
}
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
原因:可能是由于JWT签名密钥不匹配,或者JWT过期。
解决方法:
原因:可能是由于JWT格式不正确,或者Header中的加密算法不匹配。
解决方法:
通过以上步骤,你可以在NodeJS Express应用中实现JWT的双重身份验证。
云上直播间
云上直播间
新知
API网关系列直播
云+社区技术沙龙[第14期]
Techo Day
Elastic 实战工作坊
云+社区技术沙龙[第8期]
云+社区技术沙龙[第11期]
领取专属 10元无门槛券
手把手带您无忧上云