hookehuyr

feat(auth): 添加认证请求头管理功能

在登录时设置用户ID和Token到请求头,并在登出或401时清除
新增setAuthHeaders和clearAuthHeaders工具函数
确保每个请求都携带最新的用户认证信息
......@@ -10,6 +10,7 @@
import { ref, provide, inject, onMounted } from 'vue'
import { logoutAPI, getUserInfoAPI } from '@/api/users'
import { getAuthInfoAPI } from '@/api/auth'
import { clearAuthHeaders, setAuthHeaders } from '@/utils/axios'
// 创建认证上下文的Symbol key,用于provide/inject依赖注入
// 使用Symbol确保key的唯一性,避免命名冲突
......@@ -116,6 +117,8 @@ export function provideAuth() {
// 清理本地存储的用户信息和登录时间戳
localStorage.removeItem('currentUser')
// localStorage.removeItem('loginTimestamp')
// 清除认证请求头
clearAuthHeaders()
}
} catch (error) {
console.error('注销失败:', error)
......
......@@ -2,7 +2,7 @@
* @Author: hookehuyr hookehuyr@gmail.com
* @Date: 2022-05-28 10:17:40
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-06-13 09:56:29
* @LastEditTime: 2025-07-01 16:23:59
* @FilePath: /mlaj/src/utils/axios.js
* @Description:
*/
......@@ -17,10 +17,40 @@ axios.defaults.params = {
};
/**
* 设置用户认证信息到请求头
* @param {string} userId - 用户ID
* @param {string} userToken - 用户Token
*/
export const setAuthHeaders = (userId, userToken) => {
if (userId && userToken) {
axios.defaults.headers['User-Id'] = userId;
axios.defaults.headers['User-Token'] = userToken;
}
};
/**
* 清除用户认证信息
*/
export const clearAuthHeaders = () => {
delete axios.defaults.headers['User-Id'];
delete axios.defaults.headers['User-Token'];
};
/**
* @description 请求拦截器
*/
axios.interceptors.request.use(
config => {
/**
* 司总授权信息
* 动态获取 user_info 并设置到请求头
* 确保每个请求都带上最新的 user_info
*/
const user_info = localStorage.getItem('user_info') ? JSON.parse(localStorage.getItem('user_info')) : {};
if (user_info) {
config.headers['User-Id'] = user_info.user_id;
config.headers['User-Token'] = user_info.HTTP_USER_TOKEN;
}
// const url_params = parseQueryString(location.href);
// GET请求默认打上时间戳,避免从缓存中拿数据。
const timestamp = config.method === 'get' ? (new Date()).valueOf() : '';
......@@ -46,6 +76,8 @@ axios.interceptors.response.use(
if (response.data && response.data.code === 401) {
// 清除用户登录信息
localStorage.removeItem('currentUser');
// 清除认证请求头
clearAuthHeaders();
// 跳转到登录页面,并携带当前路由信息
const currentPath = router.currentRoute.value.fullPath;
router.push(`/login?redirect=${encodeURIComponent(currentPath)}`);
......
......@@ -184,6 +184,7 @@ import { useTitle } from "@vueuse/core";
import { smsAPI } from "@/api/common";
import { showToast } from "vant";
import UserAgreement from "@/components/ui/UserAgreement.vue";
import { setAuthHeaders } from "@/utils/axios";
const userAgreementRef = ref(null);
......@@ -278,6 +279,13 @@ const handleSubmit = async () => {
if (response.code !== 1) {
error.value = response.msg || "登录失败,请检查您的输入项";
return;
} else {
// 获取data里面的 user_id, HTTP_USER_TOKEN, 并设置到后面所有的请求头里面,headers.User-Id, headers.User-Token
const { user_id, HTTP_USER_TOKEN } = response?.data?.user_info || {};
if (user_id && HTTP_USER_TOKEN) {
// 设置认证请求头
setAuthHeaders(user_id, HTTP_USER_TOKEN);
}
}
const { code, data } = await getUserInfoAPI();
......