JWT身份验证

JWT身份验证

作用:

  • 基于token的鉴权机制,可以验证是否用户具有权限访问或者是否登录,如果没有登录或者权限,可以通过跳转形式,返回某个页面。

流程:

  1. 在登录后,服务器会响应给用户一个 令牌 (token)
  2. 令牌中会包括该用户的id等唯一标识
  3. 浏览器收到令牌后,自己保存
  4. 下次请求其他接口时,(在请求头中)携带这个令牌去请求
  5. 这样服务器就知道来访者的身份了,服务器就会为该用户开发接口的访问权限,并处理该用户的数据

在这里插入图片描述

全局配置请求头:

因为如果配有token机制的网站,一般很多时候用户点击的时候,进行获取数据的时候,是需要一起发送请求头的,这个时候每次都要输入请求头的方式,就显得代码比较的冗余。所以这个时候我们可以直接在全局的js文件夹中,配置全局请求头,

axios.defaults.headers.common['Authorization'] = localStorage.getItem('token');

利用令牌机制控制用户的访问权限:

在这里插入图片描述

第一个判断:判断本地存储是否有token

<!-- index.html -->
<!-- 本地存储有token,则说明用户登录了;没有token,则说明用户没有登录,不允许访问首页 -->
<script>
  if (localStorage.getItem('token') === null) location.href = './login.html'
</script>

上述判断只能判断token有没有,但不能判断token的真假,所以需要发送Ajax请求,根据服务器响应结果再次判断

第二个判断:根据服务器响应结果,判断token是否是假token或者过期的token

  • 如果token值是正确的,是没有过期的,则服务器响应 code===0
  • 如果token是错误的获取过期的,则服务器响应 code===1 && message==='身份认证失败'
// request.js 中,使用响应拦截器,拦截响应结果进行判断
// 如果响应结果中 code === 1 && message === '身份认证失败' 则表示浏览器使用了无效的token
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
}, function (error) {
    // 对响应错误做点什么
    if (error.response) {
        if (error.response.data.message === '身份认证失败') {
            localStorage.removeItem('token');
            location.href = './login.html'
        }
    }
    return Promise.reject(error);
});

统一处理错误提示:

所有接口响应的结果有两种:

  • 响应状态码 小于 400,并且 code===1,比如登录账号密码错误。这样的响应进入响应拦截器中的第一个函数。
  • 响应状态码 大于等于 400,并且 code === 1 ,比如身份认证失败。这样的响应进入响应拦截器中的第二个函数。

思路

既然有了token验证,必然就会有很多时候是没有验证的用户直接访问,那么这个时候就需要反复的去验证是否有token,这个时候我们可以通过axios里面的拦截器功能帮我们实现,避免了代码的冗余。

// request.js 中,使用响应拦截器,拦截响应结果进行判断
// 如果响应结果中 code === 1 && message === '身份认证失败' 则表示浏览器使用了无效的token
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    if (response.data.code === 1) {
        toastr.warning(response.data.message)
    }
    return response;
}, function (error) {
    // 对响应错误做点什么
    if (error.response) {
        if (error.response.data.message === '身份认证失败') {
            localStorage.removeItem('token');
            location.href = './login.html'
        } else {
            toastr.error(error.response.data.message);
        }
    }
    return Promise.reject(error);
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值