vue項目中Token的使用方式
Token的使用
1.Token驗證的基本流程
- 1.服務端收到請求,去驗證用戶名與密碼
- 2.驗證成功后,服務端會簽發(fā)一個 Token,再把這個 Token 發(fā)送給客戶端
- 3.客戶端收到 Token 以后可以把它存儲起來,比如放在 Cookie 里或者 Local Storage 里
- 4.客戶端每次向服務端請求資源的時候需要帶著服務端簽發(fā)的 Token
- 5.服務端收到請求,然后去驗證客戶端請求里面帶著的 Token,如果驗證成功,就向客戶端返回請求的數(shù)據(jù)
2. 了解與token相關的概念
2.1 JWT標準的Token有如下三個部分
- header (頭部)
- payload (數(shù)據(jù))
- signature (簽名)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInVzZXJfaWQiOjEsImlhdCI6MTU5NDI2MjQ5NSwiZXhwIjoxNTk0MzQ4ODk1fQ.1MJ_MAFgpBjOjpggj69Xz8F_evBcMAenRK_7a8fdVrc
2.2 安裝兩個依賴包
- 依賴包:jsonwebtoken
- 作用: 生成token與驗證
npm install jsonwebtoken --save
jsonwebtoken的兩個api
- 生成token的方法 sign
- 驗證token的方法 verify
依賴包: express-jwt
千萬千萬注意版本: 6.1.1
npm install express-jwt@6.1.1 --save
express-jwt的作用
驗證token是否過期并規(guī)定哪些路由不需要驗證 express-jwt({})
2.3 token Express后端相關代碼
定義生成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 設置token過期的時間
//{ user_name: user_name, user_id: user_id } 傳入需要解析的值( 一般為用戶名,用戶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)
})
}
//各個接口需要驗證token的方法
const getToken = function (token) {
return new Promise((resolve, reject) => {
if (!token) {
console.log('token是空的')
reject({
error: 'token 是空的'
})
}
else {
// 驗證token
var info = jwt.verify(token.split(' ')[1], jwtSecret);
resolve(info); //解析返回的值(sign 傳入的值)
}
})
}
module.exports = {
setToken,
getToken
}2.4 解析token,驗證token
- app.js
const express = require("express")
const app = express()
//express跨域
const cors = require("cors")
// 生成token和驗證token是否正確的函數(shù)
const vertoken=require('./token/token')
//驗證token是否過期,并規(guī)定哪些路由不用驗證token
const expressJwt=require('express-jwt')
const bookRouter = require("./router/bookRouter")
const userRouter = require("./router/userRouter")
app.use(cors())
//=============================================驗證token
//解析token獲取用戶信息
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();
})
}
});
//驗證token是否過期并規(guī)定那些路由不需要驗證
app.use(expressJwt({
secret:'dkfjdjfkdfdfd',
// 加密算法
algorithms:['HS256']
}).unless({
path:['/login'] //不需要驗證的接口名稱
}))
//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("服務器已開啟在3000端口");
})
2.5 登錄接口
- /router/usersRouter.js
const express = require("express")
const router = express.Router()
const conn = require("../db/db")
const vertoken = require("../token/token")
// 查詢商品
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('查詢數(shù)據(jù)庫失敗');
} else {
let data;
if (result.length) {
//==============================================調用生成token的方法
vertoken.setToken(user_name).then(token => {
data = {
code: 0,
message: '登錄成功',
token: token
//前端獲取token后存儲在localStroage中,
//**調用接口時 設置axios(ajax)請求頭Authorization的格式為`Bearer ` +token
}
res.send(data)
})
} else {
data = {
code: 1,
msg: '登錄失敗 '
}
res.send(data)
}
}
})
})
module.exports = router3. token Vue前端相關代碼
- 登錄后獲取token
axios.post("http://localhost:3000/login")
.then((res) => {
console.log('login返回的數(shù)據(jù)');
if (res.data.code == 0) {
alert('登錄成功')
//存儲token
sessionStorage.setItem("token",res.data.token)
}
});- 前端請求攜帶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("請登錄");
}
},
},總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue動態(tài)類名及動態(tài)樣式設置方式:class/:style
文章主要介紹了在Vue中設置動態(tài)類名(:class)和動態(tài)樣式(:style)的方法,動態(tài)類名方面,使用三元表達式、結合過濾器和計算屬性等方法進行設置,動態(tài)樣式方面,介紹了基礎用法、結合計算屬性和三元表達式進行設置等方法2022-05-05
el-select選擇器組件下拉框增加自定義按鈕的實現(xiàn)
本文主要介紹了el-select選擇器組件下拉框增加自定義按鈕的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-07-07

