首页 > 语言 > JavaScript > 正文

Vue路由之JWT身份认证的实现方法

2024-05-06 15:35:30
字体:
来源:转载
供稿:网友

一、JWT身份认证简介

JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案,相较于session机制,服务器就不需要保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。JWT 实际上是一个令牌(Token),服务器会将一些元数据、指定的secret进行签名并生成token,并返回给客户端,客户端得到这个服务器返回的令牌后,需要将其存储到 Cookie 或 localStorage 中,此后,每次与服务器通信都要带上这个令牌,可以把它放到 Cookie 中自动发送,但这样做不能跨域,所以更好的做法是将其放到 HTTP 请求头 Authorization 字段里面。

二、JWT的使用

① 安装并引入jsonwebtoken模块;
② 对元数据、secret密钥进行签名,并生成对应的token;
③ 对token进行校验是否过期;

const jwt = require("jsonwebtoken"); // 引入jwtconst secret = "this is a private key"; // 指定一个用于生成token的密钥字符串const token = jwt.sign({ foo: 'bar' }, secret, { // 传入元数据和secret密钥,并指定过期时间生成token  expiresIn: 5, // 单独一个数字表示多少秒  // expiresIn: "10h", // 表示10小时后过期  // expiresIn: "2d" // 表示2天后过期});console.log(`token is ${token}`);setTimeout(() => { // 5秒后对该token进行校验  jwt.verify(token, secret, (err, decoded) => {    console.log(err);    if (err) {      console.log('token 已经失效了.');    } else {      console.log(`token data is ${JSON.stringify(decoded)}`);    }  });}, 5000);

生成的token为一个很长的字符串,分为三部分,每部分由.号隔开,即 头部.载荷.签名,5秒后token校验结果为error,即token已经过期,校验的时候,会得到token的解码数据,主要包括生成token时候的元数据、token的签发时间(iat)、token的过期时间(exp)

// 生成的token字符串为eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE1NjY3MzE4MzEsImV4cCI6MTU2NjczMTgzNn0.cZZkExNnVqBtnfQN2vtU2Z7JB0PBo1CFyC5NiOywg54
// token decoded后的数据token data is {"foo":"bar","iat":1566731831,"exp":1566731836}

三、封装axios

由于在使用jwt认证的时候,客户端向服务器发起请求的时候,都要带上token,即要获取到token并将其放到请求头的Authorization字段中,服务器才能从authorization中取出token并进行校验,所以我们必须通过拦截器去实现,在每次请求之前将请求进行拦截,然后添加上token,再继续向服务器发起请求。

import axios from "axios";class Request {  constructor() {    this.baseURL = process.env.NODE_ENV === 'development' ? 'http://localhost:3000' : '/'; // 设置请求baseURL    this.timeout = 2000; // 设置请求超时时间  }  request(config){// 这里的config是请求的时候传递的参数配置对象,比如url、method、data等    const instance = axios.create({ // 创建axios实例      baseURL: this.baseURL,      timeout: this.timeout,    });    // 设置拦截器    instance.interceptors.request.use((config) => { // 请求拦截之后就是要使用这个config, config表示整个请求对象      config.headers.Authorization = localStorage.getItem('token'); // 将token从localStorage中取出并添加到请求头的Authorization字段上      return config; // 返回请求对象,继续向服务器发起请求    }, err => Promise.reject(err));    // 设置响应拦截器    instance.interceptors.response.use(res => res.data, err => Promise.reject(err));      return instance(config);  }}export default new Request();            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选