在web应用中,常见的token认证方式有基于token和基于cookie的认证。基于token的认证方式是,将认证信息每次放在请求头中,在每次发起请求时,将token发给服务端认证,而基于cookie的认证方式是,客户端本地存储的cookie文件来记录用户的操作状态在随后的访问请求中,客户端浏览器会检索与用户请求资源相匹配的Cookie,并将其提交给Web服务器进行验证。如果Cookie合法,则允许用户访问请求的资源,反之则拒绝用户的访问请求。
无感知刷新Token是指在Token过期之前,系统自动使用Refresh Token获取新的Access Token,从而实现Token的无感知刷新,用户可以无缝继续使用应用。在实现无感知刷新token的时候需要考虑以下几点:
3.1 使用axios作为客户端请求库
import axios from 'axios';
// 设置 tokens 到 localStorage 或其他持久化存储中
function setTokens(data) {
localStorage.setItem('access_token', data.access_token);
localStorage.setItem('refresh_token', data.refresh_token);
}
// 假设 login 是用户登录函数,从后端获取 tokens
async function login() {
const response = await axios.post('/login', { username: 'USERNAME', password: 'PASSWORD' });
setTokens(response.data);
}
3.2 设置请求头,添加token
axios.defaults.headers.common['Authorization'] = `Bearer ${accessToken}`;
3.3 拦截401 Authorization状态
// 当请求失败并返回 401 时,尝试使用 refresh token 获取新的 access token
axios.interceptors.response.use(undefined, (error) => {
if (error.response && error.response.status === 401 && localStorage.getItem('refresh_token')) {
return axios.post('/refresh_token', { refresh_token: localStorage.getItem('refresh_token') })
.then((response) => {
setTokens(response.data);
error.config.headers['Authorization'] = 'Bearer ' + response.data.access_token; // 用新的token发送请求
return axios(error.config); // 让请求再次发送
});
} else {
return Promise.reject(error); // 否则,返回原始错误信息
}
});
3.4 设置定时刷新token
function refreshToken() {
const refreshToken = localStorage.getItem('refresh_token');
axios.post('/refresh_token', { refresh_token: localStorage.getItem('refresh_token'))
.then(response => {
setTokens(response.data);
axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}`;
})
.catch(error => {
console.error(error);
});
}
setInterval(refreshToken, 5 * 60 * 1000); // 每5分钟刷新Token
4.
安全性考虑在实现无感知刷新Token的过程中,需要考虑到Refresh Token的安全性问题。因为Refresh Token具有长期的有效期限,一旦Refresh Token被泄露,攻击者就可以使用Refresh Token获取新的Access Token,从而绕过认证机制,访问受保护的API。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
token无感知刷新能有效提高用户体验并且提示安全性
加入交流群
请使用微信扫一扫!