成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

koa2服務(wù)端如何使用jwt進(jìn)行鑒權(quán)及路由權(quán)限分發(fā)-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)koa2服務(wù)端如何使用jwt進(jìn)行鑒權(quán)及路由權(quán)限分發(fā)的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

目前成都創(chuàng)新互聯(lián)公司已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、通山網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

大體思路

  后端書寫REST api時(shí),有一些api是非常敏感的,比如獲取用戶個(gè)人信息,查看所有用戶列表,修改密碼等。如果不對(duì)這些api進(jìn)行保護(hù),那么別人就可以很容易地獲取并調(diào)用這些 api 進(jìn)行操作。

  所以對(duì)于一些api,在調(diào)用之前,我們?cè)诜?wù)端必須先對(duì)操作者進(jìn)行“身份認(rèn)證”,這就是所謂的鑒權(quán)。

  Json Web Token 簡稱為 JWT,它定義了一種通信雙方之間以 JSON 對(duì)象的形式安全傳遞信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公鑰密鑰對(duì)進(jìn)行簽名,復(fù)雜度較高,換來的是更可靠的安全系數(shù)。

  整個(gè)認(rèn)證的流程大體如下:

  首先用戶登錄的接口是不用token認(rèn)證的,因?yàn)檫@個(gè)接口本身就是token的產(chǎn)生來源。前端輸入用戶名和密碼后請(qǐng)求服務(wù)器登錄接口,服務(wù)器驗(yàn)證用戶名密碼正確后,生成token并返回給前端,前端存儲(chǔ)token,并在后面的請(qǐng)求中把token帶在請(qǐng)求頭中傳給服務(wù)器,服務(wù)器驗(yàn)證token有效,才可以進(jìn)行下一步操作。

服務(wù)器生成token

  由于我們的服務(wù)端使用 Koa2 框架進(jìn)行開發(fā),除了要使用到 jsonwebtoken 庫之外,還要使用一個(gè) koa-jwt 中間件,該中間件針對(duì) Koa 對(duì) jsonwebtoken 進(jìn)行了封裝,使用起來更加方便。

 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: '用戶名或密碼錯(cuò)誤'
  }
 }
});
module.exports = router;

  (注意:這里暫時(shí)不討論加鹽加密校驗(yàn),實(shí)際項(xiàng)目中密碼不可能這樣明文驗(yàn)證,這里只是為了著重討論token鑒權(quán)。在驗(yàn)證了用戶名密碼正確之后,就可以調(diào)用 jsonwebtoken 的 sign() 方法來生成token,接收三個(gè)參數(shù),第一個(gè)是載荷,用于編碼后存儲(chǔ)在 token 中的數(shù)據(jù),也是驗(yàn)證 token 后可以拿到的數(shù)據(jù);第二個(gè)是密鑰,自己定義的,隨便寫個(gè)什么單詞都可以,但是驗(yàn)證的時(shí)候一定要相同的密鑰才能解碼;第三個(gè)是options,可以設(shè)置 token 的過期時(shí)間。)

前端獲取token

  接下來就是前端獲取 token,這里是在 vue.js 中使用 axios 進(jìn)行請(qǐng)求,請(qǐng)求成功之后拿到 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('登錄失敗')
  }
 })
}

  然后前端在請(qǐng)求后端api時(shí),就把 token 帶在請(qǐng)求頭中傳給服務(wù)器進(jìn)行驗(yàn)證。每次請(qǐng)求都要獲取 localStorage 中的 token,這樣很麻煩,這里使用了 axios 的請(qǐng)求攔截器,進(jìn)行全局設(shè)置,對(duì)每次請(qǐng)求都進(jìn)行了取 token 放到 headers 中的操作。

axios.interceptors.request.use(config => {
 const token = localStorage.getItem('token');
 config.headers.common['Authorization'] = 'Bearer ' + token;
 return config;
})

(這段代碼,如果是vue項(xiàng)目,可以直接放在main.js中設(shè)置,表示每次請(qǐng)求前都會(huì)往請(qǐng)求頭的authorization里塞一個(gè)token,至于那個(gè)Bearer 是koa-jwt的一個(gè)標(biāo)識(shí)單詞,方便解析)

服務(wù)器驗(yàn)證token

  接下來服務(wù)器收到前端發(fā)過來的token后,就可以進(jìn)行驗(yàn)證。

const koa = require('koa');
const koajwt = require('koa-jwt');
const app = new koa();

app.use(koajwt({
 secret: 'zhangnan'
}).unless({
  path: [/\/register/, /\/login/]
}));

(在這里沒有定義錯(cuò)誤處理函數(shù),由于出現(xiàn)錯(cuò)誤后會(huì)返回401,所以我直接就讓前端來處理這種異常情況,給出一個(gè)錯(cuò)誤的交互提示即可)

分析koa-jwt源碼

  我們?cè)?code>node_mudules里面找到koa-jwt/lib/resolvers文件夾下的auth-header.js文件,看下koa-jwt做了些什么

 ?。梢钥吹剿窍扰袛嗾?qǐng)求頭中是否帶了 authorization,如果有,則通過正則將 token 從 authorization 中分離出來,這里我們也看到了Bearer這個(gè)單詞。如果沒有 authorization,則代表了客戶端沒有傳 token 到服務(wù)器,這時(shí)候就拋出 401 錯(cuò)誤狀態(tài)。)

  再看看上一級(jí)的vertify.js。

  (可以看到在 verify.js 中,它就是調(diào)用 jsonwebtoken 原生提供的 verify() 方法進(jìn)行驗(yàn)證返回結(jié)果。jsonwebtoken 的 sign() 方法用于生成 token ,而 verify() 方法當(dāng)然則是用來解析 token。屬于jwt配對(duì)生產(chǎn)的兩個(gè)方法,所以koa-jwt這個(gè)中間件也沒做什么事,無非就是用正則解析請(qǐng)求頭,調(diào)用jwt的vertify方法驗(yàn)證token,在koa-jwt文件夾的index.js中,koa-jwt還調(diào)用koa-unless進(jìn)行路由權(quán)限分發(fā))

  以上就是json web token的大體流程。

感謝各位的閱讀!關(guān)于“koa2服務(wù)端如何使用jwt進(jìn)行鑒權(quán)及路由權(quán)限分發(fā)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)頁名稱:koa2服務(wù)端如何使用jwt進(jìn)行鑒權(quán)及路由權(quán)限分發(fā)-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://jinyejixie.com/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è)標(biāo)簽優(yōu)化、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
山丹县| 安新县| 芜湖县| 巢湖市| 手游| 娱乐| 得荣县| 龙川县| 鲁山县| 阿巴嘎旗| 柳河县| 慈利县| 贡觉县| 安福县| 荔浦县| 察雅县| 香河县| 五寨县| 苏尼特右旗| 靖州| 广州市| 惠东县| 鄂伦春自治旗| 太原市| 贵港市| 略阳县| 阜宁县| 得荣县| 翼城县| 金坛市| 云龙县| 肃南| 建平县| 安徽省| 冷水江市| 九台市| 藁城市| 阳新县| 鲁山县| 游戏| 惠水县|