首先,我们需要明确什么是Token,以及为什么需要使用Token。
Token是一种身份验证机制,它通常以字符串的形式存储在客户端(如浏览器)中,并在每个请求中传递给服务器。服务器可以使用它来验证客户端身份,并基于此决定是否授权客户端访问资源。
然而,Token有一个缺点,就是它们有一个过期时间(通常为几小时),过期后客户端需要重新获取Token才能访问受限资源。为了减少客户端需要反复请求Token的次数,我们可以使用RefreshToken机制。
RefreshToken是一个长期有效的Token,它用于在Token过期时获取新的Token。客户端通常在请求中使用Token,当Token过期时,客户端将使用RefreshToken请求新的Token。服务器收到带有RefreshToken的请求时,将检查RefreshToken的有效性,并使用它来生成新的Token,同时返回新的Token和新的RefreshToken。客户端将使用新的Token更新本地存储,并使用新的RefreshToken代替旧的RefreshToken。
具体实现细节如下:
- 在登录时,服务器将返回Token和RefreshToken。我们将两个Token都存储在客户端本地,例如localStorage中。
localStorage.setItem('token', response.data.token);
localStorage.setItem('refreshToken', response.data.refreshToken);
- 客户端每次请求将带上Token。
axios.defaults.headers.common['Authorization'] = `Bearer ${localStorage.getItem('token')}`
- 当Token过期时,客户端将使用RefreshToken请求新的Token。我们建议将此逻辑封装成一个函数refreshToken。
function refreshToken() {
axios.post('/refreshToken', {
refreshToken: localStorage.getItem('refreshToken')
}).then(response => {
localStorage.setItem('token', response.data.token);
localStorage.setItem('refreshToken', response.data.refreshToken);
}).catch(error => {
// 处理刷新Token失败或者RefreshToken过期的情况
});
}
- 在每次请求失败时,我们需要判断错误是否为Token过期的错误。如果是,则调用refreshToken函数来刷新Token,并重新发起请求。
axios.get('/api/data').then(response => {
// 处理正常返回的情况
}).catch(error => {
if (error.response.status === 401 && error.response.data.code === 'token_expired') {
refreshToken().then(() => {
// 刷新Token成功后,重新发起请求。
axios.get('/api/data').then(response => {
// 处理正常返回的情况
});
});
} else {
// 处理其他错误
}
});
通过上述步骤,我们就实现了双Token机制,可以减少用户Token过期重复登录问题,并且可以在Token过期时自动刷新Token,避免了客户端频繁反复请求的情况。