插件窝 干货文章 Vue前端在前后端分离架构下如何进行鉴权?

Vue前端在前后端分离架构下如何进行鉴权?

Token 前端 请求 response 131    来源:    2025-03-24

在前后端分离的架构下,Vue前端通常通过以下几种方式进行鉴权:

1. JWT(JSON Web Token)

JWT 是一种常见的鉴权方式,它通过在客户端存储一个加密的 Token 来实现鉴权。具体流程如下:

  • 登录认证:用户登录时,前端将用户名和密码发送到后端,后端验证成功后生成一个 JWT 并返回给前端。
  • 存储 Token:前端将 JWT 存储在 localStoragesessionStorage 中。
  • 请求鉴权:前端在每次请求时,将 JWT 放在 HTTP 请求头的 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;
    });
    

2. OAuth2

OAuth2 是一种授权框架,常用于第三方应用访问用户资源的场景。Vue 前端可以通过 OAuth2 的授权码模式进行鉴权。

  • 授权码模式:前端通过重定向到授权服务器获取授权码,然后将授权码发送到后端,后端通过授权码获取 Access Token。
  • 存储 Token:前端将 Access Token 存储在 localStoragesessionStorage 中。
  • 请求鉴权:前端在每次请求时,将 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);
     });
    

3. Session + Cookie

在传统的 Session 鉴权方式中,后端通过 Session 来管理用户的登录状态,前端通过 Cookie 来存储 Session ID。

  • 登录认证:用户登录时,前端将用户名和密码发送到后端,后端验证成功后创建 Session 并将 Session ID 存储在 Cookie 中。
  • 请求鉴权:前端在每次请求时,浏览器会自动携带 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);
     });
    

4. Token 刷新机制

为了防止 Token 过期,通常需要实现 Token 的刷新机制。当 Token 过期时,前端可以通过 Refresh Token 来获取新的 Access Token。

  • Refresh Token:在登录时,后端除了返回 Access Token 外,还会返回一个 Refresh Token,前端将 Refresh Token 存储在 localStoragesessionStorage 中。
  • 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);
    });
    

5. 路由守卫

在 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 刷新机制和路由守卫。选择合适的鉴权方式取决于具体的业务需求和安全性要求。