最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue項(xiàng)目中Token的使用方式

 更新時(shí)間:2024年09月03日 09:12:37   作者:Ocean__Lv  
這篇文章主要介紹了vue項(xiàng)目中Token的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Token的使用

1.Token驗(yàn)證的基本流程

  • 1.服務(wù)端收到請求,去驗(yàn)證用戶名與密碼
  • 2.驗(yàn)證成功后,服務(wù)端會(huì)簽發(fā)一個(gè) Token,再把這個(gè) Token 發(fā)送給客戶端
  • 3.客戶端收到 Token 以后可以把它存儲(chǔ)起來,比如放在 Cookie 里或者 Local Storage 里
  • 4.客戶端每次向服務(wù)端請求資源的時(shí)候需要帶著服務(wù)端簽發(fā)的 Token
  • 5.服務(wù)端收到請求,然后去驗(yàn)證客戶端請求里面帶著的 Token,如果驗(yàn)證成功,就向客戶端返回請求的數(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è)依賴包

  • 依賴包:jsonwebtoken
  • 作用: 生成token與驗(yàn)證
npm install jsonwebtoken --save

jsonwebtoken的兩個(gè)api

  • 生成token的方法 sign
  • 驗(yàn)證token的方法 verify

依賴包: express-jwt

千萬千萬注意版本: 6.1.1

npm install express-jwt@6.1.1 --save

express-jwt的作用

驗(yàn)證token是否過期并規(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過期的時(shí)間
        //{ 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)
    })
}
//各個(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ī)定哪些路由不用驗(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獲取用戶信息
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ī)定那些路由不需要驗(yàn)證
app.use(expressJwt({
    secret:'dkfjdjfkdfdfd',
    // 加密算法
    algorithms:['HS256']
}).unless({
    path:['/login']  //不需要驗(yàn)證的接口名稱
}))



//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ù)器已開啟在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) {
                //==============================================調(diào)用生成token的方法
                vertoken.setToken(user_name).then(token => {
                    data = {
                        code: 0,
                        message: '登錄成功',
                        token: token
                        //前端獲取token后存儲(chǔ)在localStroage中,
                        //**調(diào)用接口時(shí) 設(shè)置axios(ajax)請求頭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)
        }
    });
  • 前端請求攜帶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("請登錄");
      }
    },
  },

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue動(dòng)態(tài)類名及動(dòng)態(tài)樣式設(shè)置方式:class/:style

    vue動(dòng)態(tài)類名及動(dòng)態(tài)樣式設(shè)置方式:class/:style

    文章主要介紹了在Vue中設(shè)置動(dòng)態(tài)類名(:class)和動(dòng)態(tài)樣式(:style)的方法,動(dòng)態(tài)類名方面,使用三元表達(dá)式、結(jié)合過濾器和計(jì)算屬性等方法進(jìn)行設(shè)置,動(dòng)態(tài)樣式方面,介紹了基礎(chǔ)用法、結(jié)合計(jì)算屬性和三元表達(dá)式進(jìn)行設(shè)置等方法
    2022-05-05
  • Vue之props 配置詳解

    Vue之props 配置詳解

    這篇文章主要為大家介紹了Vue之props 配置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助,希望能夠給你帶來幫助
    2021-11-11
  • vue響應(yīng)式Object代理對象的修改和刪除屬性

    vue響應(yīng)式Object代理對象的修改和刪除屬性

    這篇文章主要為大家介紹了vue響應(yīng)式Object代理對象的修改和刪除屬性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • vue3 非父子組件通信詳解

    vue3 非父子組件通信詳解

    本篇文章主要介紹了詳解Vue 非父子組件通信,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-10-10
  • vue代碼分割的實(shí)現(xiàn)(codesplit)

    vue代碼分割的實(shí)現(xiàn)(codesplit)

    這篇文章主要介紹了vue代碼分割的實(shí)現(xiàn)(codesplit),做了代碼分割后,會(huì)將代碼分離到不同的bundle中,然后進(jìn)行按需加載這些文件,需要的朋友可以參考下
    2018-11-11
  • vue 監(jiān)聽窗口變化對頁面部分元素重新渲染操作

    vue 監(jiān)聽窗口變化對頁面部分元素重新渲染操作

    這篇文章主要介紹了vue 監(jiān)聽窗口變化對頁面部分元素重新渲染操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • el-select選擇器組件下拉框增加自定義按鈕的實(shí)現(xiàn)

    el-select選擇器組件下拉框增加自定義按鈕的實(shí)現(xiàn)

    本文主要介紹了el-select選擇器組件下拉框增加自定義按鈕的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Vue前端頁面版本檢測解決方案

    Vue前端頁面版本檢測解決方案

    本文主要介紹了Vue前端頁面版本檢測解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-02-02
  • vue+elementUI實(shí)現(xiàn)點(diǎn)擊按鈕互斥效果

    vue+elementUI實(shí)現(xiàn)點(diǎn)擊按鈕互斥效果

    這篇文章主要為大家詳細(xì)介紹了vue+elementUI實(shí)現(xiàn)點(diǎn)擊按鈕互斥效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 解決Vue @submit 提交后不刷新頁面問題

    解決Vue @submit 提交后不刷新頁面問題

    這篇文章主要介紹了解決Vue @submit 提交后不刷新頁面問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論

略阳县| 名山县| 汶川县| 石河子市| 浦县| 通河县| 武平县| 甘南县| 抚宁县| 神木县| 桐庐县| 和政县| 灵台县| 尼玛县| 张家界市| 海门市| 开原市| 涡阳县| 昌平区| 金坛市| 威海市| 波密县| 兰溪市| 招远市| 天门市| 内江市| 酒泉市| 墨脱县| 噶尔县| 道孚县| 剑阁县| 微山县| 岑溪市| 东安县| 漠河县| 繁峙县| 苏尼特左旗| 汕头市| 北流市| 余干县| 分宜县|