OAuth 2.0协议草案的4.2节指出授权服务器可以返回a access_token(用于向资源验证自己)以及a refresh_token,它纯粹用于创建新的access_token:
https://tools.ietf.org/html/rfc6749#section-4.2
为什么两者都有?为什么不只是做到access_token最后只要refresh_token没有refresh_token?
目前我正在尝试收集有关如何实现身份验证系统(登录)的知识。在我的研究期间,我尝试在我的后端实施基于 JWT 的解决方案。
我有一个快速服务器,它允许我注册一个用户,存储它的密码(加密)和它的电子邮件。
在登录之后,它会生成一个访问令牌(短期,5 分钟),以访问受保护的路由,以及一个刷新令牌(长期,7 天),以便在前一个过期后生成新的访问令牌。
在我当前的实现中,我将刷新令牌存储在我的数据库中,因此每次我想生成新的访问令牌时都可以使用它。
但这安全吗?据我了解,在我的数据库中存储访问令牌是危险的,因此最好创建一个短期存在的 cookie 存储。但是……刷新令牌?据我所知,这会很危险,因为它基本上允许生成新的访问令牌,所以我不明白为什么不简单地在我的数据库中存储一个长期存在的访问令牌,在每次登录时生成一个新的。
什么是刷新令牌呢?
由于我遵循了一些教程来实现这一点,这就是我的 refresh_token 路由的外观
//get a new access token with a refresh token
app.post('/refresh_token', (req, res) => {
const token = req.cookies.refreshtoken
//if no token in request
if(!token) return res.send({accesstoken : ''});
//if we have a token we verify it
let payload = null;
try{
payload = verify(token, process.env.REFRESH_TOKEN_SECRET);
}catch(err){
return res.send({accesstoken: ''});
}
//if token is valid check if user exist
const user = fakeDB.find(user => user.id === …Run Code Online (Sandbox Code Playgroud)