這篇文章給大家分享的是有關(guān)koa2服務(wù)端如何使用jwt進行鑒權(quán)及路由權(quán)限分發(fā)的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
大體思路
后端書寫REST api時,有一些api是非常敏感的,比如獲取用戶個人信息,查看所有用戶列表,修改密碼等。如果不對這些api進行保護,那么別人就可以很容易地獲取并調(diào)用這些 api 進行操作。
所以對于一些api,在調(diào)用之前,我們在服務(wù)端必須先對操作者進行“身份認證”,這就是所謂的鑒權(quán)。
Json Web Token 簡稱為 JWT,它定義了一種通信雙方之間以 JSON 對象的形式安全傳遞信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公鑰密鑰對進行簽名,復(fù)雜度較高,換來的是更可靠的安全系數(shù)。
整個認證的流程大體如下:
首先用戶登錄的接口是不用token認證的,因為這個接口本身就是token的產(chǎn)生來源。前端輸入用戶名和密碼后請求服務(wù)器登錄接口,服務(wù)器驗證用戶名密碼正確后,生成token并返回給前端,前端存儲token,并在后面的請求中把token帶在請求頭中傳給服務(wù)器,服務(wù)器驗證token有效,才可以進行下一步操作。
服務(wù)器生成token
由于我們的服務(wù)端使用 Koa2 框架進行開發(fā),除了要使用到 jsonwebtoken 庫之外,還要使用一個 koa-jwt 中間件,該中間件針對 Koa 對 jsonwebtoken 進行了封裝,使用起來更加方便。
const router = require('koa-router')(); const jwt = require('jsonwebtoken'); const userModel = require('../models/userModel.js'); router.post('/login', async (ctx) => { const data = ctx.request.body;const result = await userModel.findOne({ name: data.name, password: data.password }) if(result !== null){ const token = jwt.sign({ name: result.name, _id: result._id }, 'zhangnan', { expiresIn: '2h' }); return ctx.body = { code: 200, token: token, msg: '登錄成功' } }else{ return ctx.body = { code: 400, token: null, msg: '用戶名或密碼錯誤' } } }); module.exports = router;
(注意:這里暫時不討論加鹽加密校驗,實際項目中密碼不可能這樣明文驗證,這里只是為了著重討論token鑒權(quán)。在驗證了用戶名密碼正確之后,就可以調(diào)用 jsonwebtoken
的 sign() 方法來生成token,接收三個參數(shù),第一個是載荷,用于編碼后存儲在 token 中的數(shù)據(jù),也是驗證 token 后可以拿到的數(shù)據(jù);第二個是密鑰,自己定義的,隨便寫個什么單詞都可以,但是驗證的時候一定要相同的密鑰才能解碼;第三個是options,可以設(shè)置 token 的過期時間。)
前端獲取token
接下來就是前端獲取 token,這里是在 vue.js 中使用 axios 進行請求,請求成功之后拿到 token 保存到 localStorage 中。
submit(){ axios.post('/login', { name: this.username, password: this.password }).then(res => { if(res.code === 200){ localStorage.setItem('token', res.data.token); }else{ this.$message('登錄失敗') } }) }
然后前端在請求后端api時,就把 token 帶在請求頭中傳給服務(wù)器進行驗證。每次請求都要獲取 localStorage 中的 token,這樣很麻煩,這里使用了 axios 的請求攔截器,進行全局設(shè)置,對每次請求都進行了取 token 放到 headers 中的操作。
axios.interceptors.request.use(config => { const token = localStorage.getItem('token'); config.headers.common['Authorization'] = 'Bearer ' + token; return config; })
(這段代碼,如果是vue項目,可以直接放在main.js中設(shè)置,表示每次請求前都會往請求頭的authorization里塞一個token,至于那個Bearer 是koa-jwt的一個標識單詞,方便解析)
服務(wù)器驗證token
接下來服務(wù)器收到前端發(fā)過來的token后,就可以進行驗證。
const koa = require('koa'); const koajwt = require('koa-jwt'); const app = new koa(); app.use(koajwt({ secret: 'zhangnan' }).unless({ path: [/\/register/, /\/login/] }));
(在這里沒有定義錯誤處理函數(shù),由于出現(xiàn)錯誤后會返回401,所以我直接就讓前端來處理這種異常情況,給出一個錯誤的交互提示即可)
分析koa-jwt源碼
我們在node_mudules
里面找到koa-jwt/lib/resolvers
文件夾下的auth-header.js
文件,看下koa-jwt做了些什么
?。梢钥吹剿窍扰袛嗾埱箢^中是否帶了 authorization,如果有,則通過正則將 token 從 authorization 中分離出來,這里我們也看到了Bearer這個單詞。如果沒有 authorization,則代表了客戶端沒有傳 token 到服務(wù)器,這時候就拋出 401 錯誤狀態(tài)。)
再看看上一級的vertify.js。
?。梢钥吹皆?verify.js 中,它就是調(diào)用 jsonwebtoken
原生提供的 verify() 方法進行驗證返回結(jié)果。jsonwebtoken
的 sign() 方法用于生成 token ,而 verify() 方法當(dāng)然則是用來解析 token。屬于jwt配對生產(chǎn)的兩個方法,所以koa-jwt這個中間件也沒做什么事,無非就是用正則解析請求頭,調(diào)用jwt的vertify方法驗證token,在koa-jwt文件夾的index.js中,koa-jwt還調(diào)用koa-unless進行路由權(quán)限分發(fā))
以上就是json web token的大體流程。
感謝各位的閱讀!關(guān)于“koa2服務(wù)端如何使用jwt進行鑒權(quán)及路由權(quán)限分發(fā)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
網(wǎng)頁名稱:koa2服務(wù)端如何使用jwt進行鑒權(quán)及路由權(quán)限分發(fā)-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://www.rwnh.cn/article10/csdgdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、標簽優(yōu)化、手機網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容