暴露refreshtoken API并不安全,因为该API可以用来获取新的访问令牌,使攻击者获得对受保护资源的访问权限。一种解决方法是使用JWT(JSON Web Token)解决方案,它使用一种基于标准的方法,以JSON对象的形式安全地将声明传输给双方,以便进行身份验证和授权。
下面是使用JWT实现refreshtoken的示例代码:
var jwt = require('jsonwebtoken');
var refreshTokens = {};
// 登录时为用户生成新令牌和刷新令牌
app.post('/login', function(req, res) {
// 用户验证
var username = req.body.username;
var password = req.body.password;
var user = authenticateUser(username, password);
if (user) {
// 版本1(with refresh token)
var token = jwt.sign(user, 'secretkey', { expiresIn: '15s' });
var refreshToken = jwt.sign(user, 'refreshKey');
refreshTokens[refreshToken] = username;
res.json({token: token, refreshToken: refreshToken});
} else {
// 身份验证失败
res.sendStatus(401);
}
});
// 使用刷新令牌获取新访问令牌
app.post('/token', function(req, res) {
var refreshToken = req.body.refreshToken;
if (refreshToken in refreshTokens) {
var user = {
username: refreshTokens[refreshToken],
role: 'admin'
};
var token = jwt.sign(user, 'secretkey', { expiresIn: '15s' });
res.json({token: token});
} else {
res.sendStatus(401);
}
});
// 在退出时删除刷新令牌
app.post('/logout', function(req, res) {
var refreshToken = req.body.refreshToken;
delete refreshTokens[refreshToken];
res.sendStatus(204);
});
这个示例代码中,当用户成功登录时,将生成一个新的
上一篇:保罗·格雷厄姆是如何解决他在Bel引用中的循环性问题的?
下一篇:暴露容器管理的EntityManger/EntityManagerFactory/PersistenceContext到JNDI