主动介入token的操作

 1.在拦截器中进行修改

  

const timeKey = 'hrsaas-timestamp-key' // 设置一个独一无二的key

// 获取时间戳
export function getTimeStamp() {
  return Cookies.get(timeKey)
}
// 设置时间戳
export function setTimeStamp() {
  Cookies.set(timeKey, Date.now())
}
import router from '@/router'
import { Message } from 'element-ui'
import { getTimeStamp } from '@/utils/auth'
const TimeOut = 3600 // 定义超时时间vv


// 请求拦截器
service.interceptors.request.use(config => {
  // config 是请求的配置信息
  // 注入token
  if (store.getters.token) {
    // 只有在有token的情况下 才有必要去检查时间戳是否超时
    if (IsCheckTimeOut()) {
      // 如果它为true表示 过期了
      // token没用了 因为超时了
      store.dispatch('user/logout') // 登出操作
      // 跳转到登录页
      router.push('/login')
      return Promise.reject(new Error('token超时了'))
    }
    config.headers['Authorization'] = `Bearer ${store.getters.token}`
  }
  return config // 必须要返回的
}, error => {
  return Promise.reject(error)
})

/ 是否超时
// 超时逻辑  (当前时间  - 缓存中的时间) 是否大于 时间差
function IsCheckTimeOut() {
  var currentTime = Date.now() // 当前时间戳
  var timeStamp = getTimeStamp() // 缓存时间戳
  return (currentTime - timeStamp) / 1000 > TimeOut
}
在获取token的时候  把当前的最新时间写入缓存中

 

 2. 使用 Axios 进行 HTTP 请求

  1. 获取 Token: 用户在登录时,通常会提供用户名和密码,通过向服务器发送登录请求,服务器验证用户身份后,会返回一个包含 token 的响应。

  2. 存储 Token: 前端通常会将 token 存储在客户端,可以使用浏览器提供的 localStorage 或 sessionStorage 进行存储。存储 token 的目的是为了在用户访问需要权限的页面时,能够提供有效的身份认证。

  3. 发送 Token 到服务器: 在每次向服务器发送请求时,需要在请求头中包含 token。可以通过拦截器或者在每次请求前手动设置请求头的方式实现。服务器收到请求后会验证 token 的有效性,并根据权限进行相应的处理。

  4. Token 的更新与失效处理: token 通常有一个过期时间,一旦过期,就需要重新获取新的 token。可以在前端定时检查 token 是否过期,或者在服务器端返回特定的响应码来通知前端 token 过期。在 token 失效时,需要引导用户重新进行登录,获取新的 token。

import axios from 'axios';

// 登录,获取 token
function login(username, password) {
  return axios.post('/login', { username, password })
    .then(response => {
      const token = response.data.token;
      // 将 token 存储在 localStorage 中
      localStorage.setItem('token', token);
      return token;
    });
}

// 发送请求时,在请求头中包含 token
function sendRequestWithToken(url, method, data) {
  const token = localStorage.getItem('token');
  return axios({
    method: method,
    url: url,
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    data: data
  });
}

// 检查 token 是否过期
function checkTokenExpiration() {
  const token = localStorage.getItem('token');
  // 检查 token 是否存在且未过期
  if (token && !isTokenExpired(token)) {
    return true;
  } else {
    return false;
  }
}

// 判断 token 是否过期
function isTokenExpired(token) {
  // 这里可以根据 token 的具体格式来判断是否过期,示例代码中假设 token 包含过期时间 exp
  const expiration = getTokenExpiration(token);
  return expiration < Date.now() / 1000;
}

// 获取 token 的过期时间
function getTokenExpiration(token) {
  // 假设 token 包含过期时间字段 exp
  const payload = JSON.parse(atob(token.split('.')[1]));
  return payload.exp;
}

// 在需要的地方调用登录函数进行登录,并在登录成功后发送带 token 的请求
login('username', 'password')
  .then(() => {
    sendRequestWithToken('/api/data', 'GET')
      .then(response => {
        console.log(response.data);
      })
      .catch(error => {
        console.error('Error fetching data:', error);
      });
  });

 总结:


1.用户认证和授权:

  • 认证(Authentication): 确认用户的身份是否有效,通常通过用户名和密码、第三方身份提供者(如 Google、Facebook)或其他方式进行。
  • 授权(Authorization): 确定用户是否有权访问特定资源或执行特定操作。这通常涉及到对用户角色、权限或组的管理。      

2. 安全性考虑  

  • CSRF(Cross-Site Request Forgery)防护: 确保你的应用程序能够有效地防范 CSRF 攻击,这通常涉及到在每个请求中包含一个随机生成的 token,并在服务器端验证该 token 的有效性。
  • XSS(Cross-Site Scripting)防护: 避免将用户提供的内容直接插入到页面中,以防止 XSS 攻击。

3.持久化存储

  • 通常会将用户的认证状态存储在客户端,以便用户在刷新页面或重新打开应用程序时不必重新登录。常见的存储方式包括 localStorage、sessionStorage 和 cookies。

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值