Token的使用

網(wǎng)址:http://www.reibang.com/p/58abb716b5dc/

具體概念參考上面鏈接

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

1.服務(wù)端收到請(qǐng)求廓奕,去驗(yàn)證用戶名與密碼
2.驗(yàn)證成功后县爬,服務(wù)端會(huì)簽發(fā)一個(gè) Token,再把這個(gè) Token 發(fā)送給客戶端
3.客戶端收到 Token 以后可以把它存儲(chǔ)起來(lái)返十,比如放在 Cookie 里或者 Local Storage 里
4.客戶端每次向服務(wù)端請(qǐng)求資源的時(shí)候需要帶著服務(wù)端簽發(fā)的 Token
5.服務(wù)端收到請(qǐng)求策肝,然后去驗(yàn)證客戶端請(qǐng)求里面帶著的 Token肛捍,如果驗(yàn)證成功,就向客戶端返回請(qǐng)求的數(shù)據(jù)

JWT標(biāo)準(zhǔn)的Token有如下三個(gè)部分

header (頭部)
payload (數(shù)據(jù))
signature (簽名)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInVzZXJfaWQiOjEsImlhdCI6MTU5NDI2MjQ5NSwiZXhwIjoxNTk0MzQ4ODk1fQ.1MJ_MAFgpBjOjpggj69Xz8F_evBcMAenRK_7a8fdVrc

安裝

//生成token與驗(yàn)證
 1.jsonwebtoken
 npm install jsonwebtoken --save
 * 生成token的方法 sign
 * 驗(yàn)證token的方法 verify

2.express-jwt
 npm install express-jwt --save
* 驗(yàn)證token是否過(guò)期并規(guī)定那些路由不需要驗(yàn)證 express-jwt({})

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 } 傳入需要解析的值( 一般為用戶名之众,用戶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
}

解析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())

//允許訪問(wèn)upload下的靜態(tài)資源
app.use(express.static("upload"))
// 解析post請(qǐng)求的參數(shù)
app.use(express.json())

//=============================================驗(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ò)期并規(guī)定那些路由不需要驗(yàn)證
app.use(expressJwt({
    secret:'dkfjdjfkdfdfd',
    // 加密算法
    algorithms:['HS256']
}).unless({
    path:['/login']  //不需要驗(yàn)證的接口名稱(chēng)
}))

//設(shè)置托管靜態(tài)目錄; 項(xiàng)目根目錄+ public.可直接訪問(wèn)public文件下的文件eg:http://localhost:3000/images/url.jpg

//token失效返回信息
app.use(function(err,req,res,next){
    if(err.status==401){
        res.status(401).send('token失效11111111')
    }
})

app.use(bookRouter)
app.use(userRouter)

app.listen(3000, () => {
    console.log("服務(wù)器已開(kāi)啟在3000端口");
})


登錄接口

/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ù)庫(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

token Vue前端相關(guān)代碼

登錄后獲取token

login(this.ruleForm)
    .then((res) => {
        console.log('login返回的數(shù)據(jù)');
        if (res.data.code == 0) {
        this.$message({
            message: "登錄成功",
            center: true,
        });

        //存儲(chǔ)token
        localStorage.setItem("token",res.data.token)
        this.$router.push("/Layout")
        }
    });

前端請(qǐng)求攜帶token

api/config.js

import axios from 'axios'

// 給所有axios請(qǐng)求設(shè)置基礎(chǔ)的域名
// axios.defaults.baseURL = 'http://localhost:3000'


//用axios.create可以創(chuàng)建axios的實(shí)例,允許不同實(shí)例有不同配置
const axios1 = axios.create({
    baseURL: 'http://localhost:3000',
    // 請(qǐng)求超時(shí)的時(shí)間
    timeout: 5000
}); 
// const axios2 = axios.create({
//     baseURL: 'http://www.test.com',
//     timeout: 5000
// });


//添加請(qǐng)求攔截器棺禾,會(huì)在發(fā)起請(qǐng)求之前執(zhí)行相應(yīng)的需求
axios1.interceptors.request.use(function (config) {
    // console.log('我是請(qǐng)求攔截器');
    config.headers.common['Authorization'] = 'Bearer ' + localStorage.getItem("token");
    // Do something before request is sent
    return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

// //添加響應(yīng)攔截器缀蹄,會(huì)在返回?cái)?shù)據(jù)后先執(zhí)行相應(yīng)的需求
axios1.interceptors.response.use(function (response) {
    console.log('我是響應(yīng)攔截器');
    // Do something with response data
    return response;
  }, function (error) {
    // Do something with response error
    console.log('error',error.status);

    return Promise.reject(error);
  });
export default axios1
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膘婶,隨后出現(xiàn)的幾起案子缺前,更是在濱河造成了極大的恐慌,老刑警劉巖竣付,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诡延,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡古胆,警方通過(guò)查閱死者的電腦和手機(jī)肆良,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)筛璧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人惹恃,你說(shuō)我怎么就攤上這事夭谤。” “怎么了巫糙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵朗儒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我参淹,道長(zhǎng)醉锄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任浙值,我火速辦了婚禮恳不,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘开呐。我一直安慰自己烟勋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布筐付。 她就那樣靜靜地躺著卵惦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓦戚。 梳的紋絲不亂的頭發(fā)上沮尿,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音较解,去河邊找鬼蛹找。 笑死,一個(gè)胖子當(dāng)著我的面吹牛哨坪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乍楚,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼当编,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了徒溪?” 一聲冷哼從身側(cè)響起忿偷,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臊泌,沒(méi)想到半個(gè)月后鲤桥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渠概,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年茶凳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嫂拴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贮喧,死狀恐怖筒狠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情箱沦,我是刑警寧澤辩恼,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站谓形,受9級(jí)特大地震影響灶伊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寒跳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一聘萨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冯袍,春花似錦匈挖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至征冷,卻和暖如春择膝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背检激。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工肴捉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叔收。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓齿穗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饺律。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窃页,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 網(wǎng)址:http://www.reibang.com/p/58abb716b5dc/[https://www.ji...
    wen_7ef0閱讀 329評(píng)論 0 1
  • 網(wǎng)址:http://www.reibang.com/p/58abb716b5dc/[https://www.ji...
    波仔_4867閱讀 5,031評(píng)論 0 3
  • 項(xiàng)目中是使用Koa的搭建服務(wù)器。端口配置放在.env文件中复濒,上傳時(shí)應(yīng)該忽略該文件脖卖,因?yàn)槊總€(gè)設(shè)備有自己的端口號(hào)。這里...
    哆啦_閱讀 744評(píng)論 0 0
  • 一.為什么要使用token1.token完全有應(yīng)用管理巧颈,它可以避開(kāi)同源策略2.token可以避免CSRF攻擊3.t...
    隨風(fēng)_283b閱讀 3,534評(píng)論 0 1
  • 前后端分離以及token的使用 為什么使用前后端分離: 首先說(shuō)一下jsp的工作原理: jsp實(shí)際上也是是一個(gè)繼承自...
    韓who閱讀 4,542評(píng)論 0 2