vue項(xiàng)目中Token的使用方式
Token的使用
1.Token驗(yàn)證的基本流程
- 1.服務(wù)端收到請(qǐng)求,去驗(yàn)證用戶(hù)名與密碼
- 2.驗(yàn)證成功后,服務(wù)端會(huì)簽發(fā)一個(gè) Token,再把這個(gè) Token 發(fā)送給客戶(hù)端
- 3.客戶(hù)端收到 Token 以后可以把它存儲(chǔ)起來(lái),比如放在 Cookie 里或者 Local Storage 里
- 4.客戶(hù)端每次向服務(wù)端請(qǐng)求資源的時(shí)候需要帶著服務(wù)端簽發(fā)的 Token
- 5.服務(wù)端收到請(qǐng)求,然后去驗(yàn)證客戶(hù)端請(qǐng)求里面帶著的 Token,如果驗(yàn)證成功,就向客戶(hù)端返回請(qǐng)求的數(shù)據(jù)
2. 了解與token相關(guān)的概念
2.1 JWT標(biāo)準(zhǔn)的Token有如下三個(gè)部分
- header (頭部)
- payload (數(shù)據(jù))
- signature (簽名)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInVzZXJfaWQiOjEsImlhdCI6MTU5NDI2MjQ5NSwiZXhwIjoxNTk0MzQ4ODk1fQ.1MJ_MAFgpBjOjpggj69Xz8F_evBcMAenRK_7a8fdVrc
2.2 安裝兩個(gè)依賴(lài)包
- 依賴(lài)包:jsonwebtoken
- 作用: 生成token與驗(yàn)證
npm install jsonwebtoken --save
jsonwebtoken的兩個(gè)api
- 生成token的方法 sign
- 驗(yàn)證token的方法 verify
依賴(lài)包: express-jwt
千萬(wàn)千萬(wàn)注意版本: 6.1.1
npm install express-jwt@6.1.1 --save
express-jwt的作用
驗(yàn)證token是否過(guò)期并規(guī)定哪些路由不需要驗(yàn)證 express-jwt({})
2.3 token Express后端相關(guān)代碼
定義生成token和獲取token的函數(shù)
- /token/token.js
const jwt = require('jsonwebtoken'); // 密鑰 const jwtSecret = 'dkfjdjfkdfdfd'; //簽名 //登錄接口 生成token的方法 // setToken攜帶的參數(shù)及參數(shù)的數(shù)量自定義 const setToken = function (user_name) { return new Promise((resolve, reject) => { //expiresln 設(shè)置token過(guò)期的時(shí)間 //{ user_name: user_name, user_id: user_id } 傳入需要解析的值( 一般為用戶(hù)名,用戶(hù)id 等) // const token = jwt.sign({ user_name: user_name }, jwtSecret, { expiresIn: '24h' }); const token = jwt.sign({ user_name: user_name }, jwtSecret, { expiresIn: '10s' }); resolve(token) }) } //各個(gè)接口需要驗(yàn)證token的方法 const getToken = function (token) { return new Promise((resolve, reject) => { if (!token) { console.log('token是空的') reject({ error: 'token 是空的' }) } else { // 驗(yàn)證token var info = jwt.verify(token.split(' ')[1], jwtSecret); resolve(info); //解析返回的值(sign 傳入的值) } }) } module.exports = { setToken, getToken }
2.4 解析token,驗(yàn)證token
- app.js
const express = require("express") const app = express() //express跨域 const cors = require("cors") // 生成token和驗(yàn)證token是否正確的函數(shù) const vertoken=require('./token/token') //驗(yàn)證token是否過(guò)期,并規(guī)定哪些路由不用驗(yàn)證token const expressJwt=require('express-jwt') const bookRouter = require("./router/bookRouter") const userRouter = require("./router/userRouter") app.use(cors()) //=============================================驗(yàn)證token //解析token獲取用戶(hù)信息 app.use(function(req, res, next) { let token = req.headers['authorization']; if(token == undefined){ next(); }else{ vertoken.getToken(token).then((data)=> { console.log('解析后的token',data); req.data = data; next(); }).catch((error)=>{ next(); }) } }); //驗(yàn)證token是否過(guò)期并規(guī)定那些路由不需要驗(yàn)證 app.use(expressJwt({ secret:'dkfjdjfkdfdfd', // 加密算法 algorithms:['HS256'] }).unless({ path:['/login'] //不需要驗(yàn)證的接口名稱(chēng) })) //token失效返回信息 app.use(function(err,req,res,next){ if(err.status==401){ res.status(401).send('token失效11111111') }else{ next() } }) app.use(bookRouter) app.use(userRouter) app.listen(3000, () => { console.log("服務(wù)器已開(kāi)啟在3000端口"); })
2.5 登錄接口
- /router/usersRouter.js
const express = require("express") const router = express.Router() const conn = require("../db/db") const vertoken = require("../token/token") // 查詢(xún)商品 router.post("/login", (req, res) => { let { user_name, pw } = req.body; let sql = "select * from admin where user_name = ? and pw = ?" conn.query(sql, [user_name, pw], function (err, result) { if (err) { console.log('查詢(xún)數(shù)據(jù)庫(kù)失敗'); } else { let data; if (result.length) { //==============================================調(diào)用生成token的方法 vertoken.setToken(user_name).then(token => { data = { code: 0, message: '登錄成功', token: token //前端獲取token后存儲(chǔ)在localStroage中, //**調(diào)用接口時(shí) 設(shè)置axios(ajax)請(qǐng)求頭Authorization的格式為`Bearer ` +token } res.send(data) }) } else { data = { code: 1, msg: '登錄失敗 ' } res.send(data) } } }) }) module.exports = router
3. token Vue前端相關(guān)代碼
- 登錄后獲取token
axios.post("http://localhost:3000/login") .then((res) => { console.log('login返回的數(shù)據(jù)'); if (res.data.code == 0) { alert('登錄成功') //存儲(chǔ)token sessionStorage.setItem("token",res.data.token) } });
- 前端請(qǐng)求攜帶token
methods: { async getList() { let token = localStorage.getItem("token"); if (token) { let res = await axios.get("http://localhost:5000/cart", { headers: { Authorization: "Bearer " + localStorage.getItem("token"), }, }); this.list = res.data.list; } else { alert("請(qǐng)登錄"); } }, },
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue+socket.io+express+mongodb 實(shí)現(xiàn)簡(jiǎn)易多房間在線群聊示例
本篇文章主要介紹了vue+socket.io+express+mongodb 實(shí)現(xiàn)簡(jiǎn)易多房間在線群聊示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-10-10解決Vue中的生命周期beforeDestory不觸發(fā)的問(wèn)題
這篇文章主要介紹了解決Vue中的生命周期beforeDestory不觸發(fā)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07VUE+elementui組件在table-cell單元格中繪制微型echarts圖
這篇文章主要介紹了VUE+elementui組件在table-cell單元格中繪制微型echarts圖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Vue實(shí)現(xiàn)登錄功能全套超詳細(xì)講解(含封裝axios)
這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)登錄功能(含封裝axios)的相關(guān)資料,Vue是現(xiàn)在前端最流行的框架之一,作為前端開(kāi)發(fā)人員應(yīng)該要熟練的掌握它,需要的朋友可以參考下2023-10-10useEffect理解React、Vue設(shè)計(jì)理念的不同
這篇文章主要為大家介紹了useEffect理解React、Vue設(shè)計(jì)理念的不同詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09vue中實(shí)現(xiàn)彈出層動(dòng)畫(huà)效果的示例代碼
這篇文章主要介紹了vue中怎樣實(shí)現(xiàn)彈出層動(dòng)畫(huà)效果,由上而下漸漸顯示,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-09-09vue封裝實(shí)現(xiàn)自動(dòng)循環(huán)滾動(dòng)的列表
在做數(shù)據(jù)大屏開(kāi)發(fā)的過(guò)程中,經(jīng)常出現(xiàn)需要對(duì)列表進(jìn)行自動(dòng)滾動(dòng)的需求,所以本文就來(lái)為大家介紹一下如何利用vue封裝一個(gè)自動(dòng)循環(huán)滾動(dòng)的列表吧2023-09-09淺談ElementUI中switch回調(diào)函數(shù)change的參數(shù)問(wèn)題
今天小編就為大家分享一篇淺談ElementUI中switch回調(diào)函數(shù)change的參數(shù)問(wèn)題,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Vue中使用debugger在瀏覽器中不起作用的問(wèn)題及解決
這篇文章主要介紹了Vue中使用debugger在瀏覽器中不起作用的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06