在前后端分离的架构下,Vue前端通常通过以下几种方式进行鉴权:
JWT 是一种常见的鉴权方式,它通过在客户端存储一个加密的 Token 来实现鉴权。具体流程如下:
localStorage
或 sessionStorage
中。Authorization
字段中发送给后端。Token 验证:后端接收到请求后,验证 JWT 的有效性,如果有效则处理请求,否则返回 401 状态码。
示例代码:
// 登录成功后存储 Token
localStorage.setItem('token', response.data.token);
// 请求时携带 Token
axios.interceptors.request.use(config => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
OAuth2 是一种授权框架,常用于第三方应用访问用户资源的场景。Vue 前端可以通过 OAuth2 的授权码模式进行鉴权。
localStorage
或 sessionStorage
中。请求鉴权:前端在每次请求时,将 Access Token 放在 HTTP 请求头的 Authorization
字段中发送给后端。
示例代码:
// 重定向到授权服务器获取授权码
window.location.href = `https://auth-server.com/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code`;
// 获取授权码后发送到后端
axios.post('/api/oauth/token', { code: authorizationCode })
.then(response => {
localStorage.setItem('access_token', response.data.access_token);
});
在传统的 Session 鉴权方式中,后端通过 Session 来管理用户的登录状态,前端通过 Cookie 来存储 Session ID。
Session 验证:后端接收到请求后,通过 Session ID 验证用户的登录状态。
示例代码:
// 登录请求
axios.post('/api/login', { username, password })
.then(response => {
// 登录成功后,后端会在响应头中设置 Set-Cookie,浏览器会自动存储 Cookie
});
// 请求时浏览器会自动携带 Cookie
axios.get('/api/user')
.then(response => {
console.log(response.data);
});
为了防止 Token 过期,通常需要实现 Token 的刷新机制。当 Token 过期时,前端可以通过 Refresh Token 来获取新的 Access Token。
localStorage
或 sessionStorage
中。Token 刷新:当 Access Token 过期时,前端使用 Refresh Token 请求新的 Access Token。
示例代码:
// 登录成功后存储 Access Token 和 Refresh Token
localStorage.setItem('access_token', response.data.access_token);
localStorage.setItem('refresh_token', response.data.refresh_token);
// 请求时检查 Access Token 是否过期
axios.interceptors.response.use(response => {
return response;
}, error => {
if (error.response.status === 401) {
// 使用 Refresh Token 获取新的 Access Token
axios.post('/api/refresh-token', { refresh_token: localStorage.getItem('refresh_token') })
.then(response => {
localStorage.setItem('access_token', response.data.access_token);
// 重新发起之前的请求
return axios(error.config);
});
}
return Promise.reject(error);
});
在 Vue 中,可以通过路由守卫(beforeEach
)来实现页面的访问控制,确保用户在未登录时无法访问受保护的页面。
示例代码:
javascript
router.beforeEach((to, from, next) => {
const isAuthenticated = localStorage.getItem('token') !== null;
if (to.meta.requiresAuth && !isAuthenticated) {
next('/login');
} else {
next();
}
});
在前后端分离的架构下,Vue 前端通常通过 JWT、OAuth2、Session + Cookie 等方式进行鉴权。为了增强安全性,还可以实现 Token 刷新机制和路由守卫。选择合适的鉴权方式取决于具体的业务需求和安全性要求。