我在OAuth2中很少混淆Refresh Token . 就像它说访问令牌限制黑客可以使用用户凭证的1小时的时间窗口和刷新令牌是可以用来重新创建访问令牌的长实时令牌 .
我很困惑如果有人从cookie中窃取了访问令牌,他也可以窃取刷新令牌,并且可以使用刷新令牌来创建新的访问令牌,因为我在JQuery(客户端)中有ajax请求
NOTE: 我已经创建了ajax请求以在服务器端发送刷新令牌我在那里附加了客户端ID和秘密以及授权类型刷新令牌 .
我已经在cookie中保存了访问令牌和刷新令牌,并使用ajax请求来获取新的访问令牌
jQuery(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
//console.log('event');console.log(event);
//console.log('jqXHR');console.log(jqXHR);
//console.log('ajaxSettings');console.log(ajaxSettings);
//console.log('thrownError');console.log(thrownError);
if(jqXHR.status == 403)
{
console.log('User is not Loged in Redictet to Login Page');
}
if(jqXHR.status == 401)
{
var refresh_token = Cookies.get('refresh_token');
if(refresh_token != undefined)
{
$.ajax({
url: CONNECT_API_URL+'/refresh-token',
type: "POST",
data:{ refresh_token: refresh_token },
success: function(response, status, jqXHR){
if(response.access_token != undefined)
{
var expires_in = new Date(new Date().getTime() + response.expires_in * 1000);
var access_token = response.token_type+' '+response.access_token;
Cookies.set('access_token', access_token, { expires: expires_in });
Cookies.set('refresh_token', response.refresh_token, { expires: 14 });
$.ajax(ajaxSettings); // Re send same ajax request with access token in cookie has been set
}
else
{
console.log('Redirect to login page.');
}
},
});
}
}
});
我应该如何使用刷新令牌来增强安全性?
1 回答
在这篇 Headers 为Refresh Tokens: When to Use Them and How They Interact with JWTs的博客文章中,您可以很好地讨论您的问题中的主题 .
该帖子引用:
在RFC6819 spec中,他们编写了关于在客户端上存储访问令牌的以下内容:
关于刷新令牌的发布:
这意味着您应该仔细考虑要存储刷新令牌的位置 . 这篇文章Where to Store your JWTs – Cookies vs HTML5 Web Storage正好涉及这个主题 .
正如前面提到的那样in this answer on StackOverflow只有
refresh_token
不足以获得新的access_token
.这也可以在同一个_2709278中找到:
刷新令牌只能使用一次 . 当使用
refresh_token
时,它将返回一个新的access_token
和一个新的refresh_token
. 它使旧的refresh_token
无用,意味着它无法再使用 .它还允许身份验证服务器识别
refresh_token
已被泄露,因为它应该只使用一次 . 如果验证服务器中出现了具有相同refresh_token
的新续订请求,则知道存在可疑的情况 . 不知道服务器处理这种情况的正确方法是什么......(也许其他人可以对此有所了解)这也在_2709285中:
您的访问权限和刷新令牌可以在客户端受到攻击,但令牌也可能在客户端和服务器之间的某个地方被截获 .
refresh_token
只发送一次到客户端,而每次请求都会将access_token
发送到服务器,这就是为什么一个中间人接触你的access_token
的机会远大于你的机会 .refresh_token
遭到入侵 .通常,最好完全理解OAuth2协议,以便您可以正确实现它 . 关于安全性我简单地说:
使用JWT的 first demand 是客户端和服务器之间正确配置的https连接,以便在来回发送时对所有令牌进行适当加密 .
A second demand 是您在客户端以安全的方式存储令牌 .
我希望这能为您提供有关此主题的一些见解 . 如果有人想添加或更正我的帖子,请随时编辑/更新/补充答案或发表评论 .