JSON Web Tokens(JWT)是為了在網絡應用環境下傳遞聲明而執行的一種基于JSON的開放標準。JWT是一種基于令牌的認證機制,它可以確保用戶請求是合法的,用戶在訪問受限資源時,令牌將作為身份驗證憑據。Vue.js是一種漸進式JavaScript框架,它可以構建交互式的用戶界面。
Vue.js中有一個很好用的插件是vue-router,它提供了路由管理的功能。可以使用它來創建單頁應用,在應用中實現URL的路由管理。在前后端分離的應用中,使用其中的路由守衛可以實現前端頁面的權限控制。當用戶在Vue應用中訪問受限頁面時,服務器會驗證用戶的身份,如果用戶的身份驗證成功,服務器會將一個JWT令牌返回給前端應用。
import jwtDecode from "jwt-decode"; import VueJwtDecode from "vue-jwt-decode"; import JwtService from "@/services/jwt.service"; const state = { errors: null, user: {}, isAuthenticated: !!JwtService.getToken(), decodedToken: null }; const mutations = { //將jwt解碼為明文對象 decodedToken(state, token) { state.decodedToken = VueJwtDecode.decode(token); }, //將明文對象存儲到state中 setUser(state, user) { state.isAuthenticated = true; state.user = user; state.errors = {}; JwtService.saveToken(state.user.token); }, ... }
Vue應用會將JWT令牌進行解碼,并從中提取出用戶的身份信息。在Vuex Store中可以創建一個專門存儲JWT信息的模塊,這個模塊會提供一些公共的方法,比如getToken()用來從瀏覽器緩存中取回JWT令牌,又比如saveToken(token)用來將JWT令牌存儲在瀏覽器緩存中以便下次使用。
import axios from "axios"; import JwtService from "@/services/jwt.service"; const API_URL = process.env.VUE_APP_API_URL; class ApiService { constructor() { this.setHeader(); // 初始化header } setHeader() { axios.defaults.headers.common[ "Authorization" ] = `Bearer ${JwtService.getToken()}`; } ... } export default new ApiService();
在Vuex Store給出存儲JWT信息的模塊之后,我們還需要在Vue應用中加入一個服務層,服務層可以將所有的API請求都通過JWT令牌進行身份驗證。服務層會向后端API發送HTTP請求,并且將JWT令牌與請求頭一起發送給后端API。
在Vue.js應用中使用JWT認證可以保證應用的安全性。通過對JWT令牌的驗證,可以防止非法的訪問請求發生,同時提高了應用的安全性。開發人員可以專注于實現業務邏輯,而不用擔心用戶的安全問題。