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

koa2服務(wù)端使用jwt進(jìn)行鑒權(quán)及路由權(quán)限分發(fā)的流程分析

 更新時間:2019年07月22日 10:49:55   作者:陌上兮月  
這篇文章主要介紹了koa2服務(wù)端使用jwt進(jìn)行鑒權(quán)及路由權(quán)限分發(fā) ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下

大體思路

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

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

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

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

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

服務(wù)器生成token

  由于我們的服務(wù)端使用 Koa2 框架進(jìn)行開發(fā),除了要使用到 jsonwebtoken 庫之外,還要使用一個 koa-jwt 中間件,該中間件針對 Koa 對 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: '用戶名或密碼錯誤'
  }
 }
});
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 進(jìn)行請求,請求成功之后拿到 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ù)器進(jìn)行驗證。每次請求都要獲取 localStorage 中的 token,這樣很麻煩,這里使用了 axios 的請求攔截器,進(jìn)行全局設(shè)置,對每次請求都進(jìn)行了取 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的一個標(biāo)識單詞,方便解析)

服務(wù)器驗證token

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

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() 方法進(jìn)行驗證返回結(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進(jìn)行路由權(quán)限分發(fā))

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

總結(jié)

以上所述是小編給大家介紹的koa2服務(wù)端使用jwt進(jìn)行鑒權(quán)及路由權(quán)限分發(fā)的流程分析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Javascript中匿名函數(shù)的多種調(diào)用方式總結(jié)

    Javascript中匿名函數(shù)的多種調(diào)用方式總結(jié)

    這篇文章主要是對Javascript中匿名函數(shù)的多種調(diào)用方式進(jìn)行了詳細(xì)的總結(jié)介紹。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • 不到200行 JavaScript 代碼實現(xiàn)富文本編輯器的方法

    不到200行 JavaScript 代碼實現(xiàn)富文本編輯器的方法

    這篇文章主要介紹了不到200行 JavaScript 代碼實現(xiàn)富文本編輯器的方法,需要的朋友可以參考下
    2018-01-01
  • uniapp藍(lán)牙連接的通用步驟

    uniapp藍(lán)牙連接的通用步驟

    這篇文章主要給大家介紹了關(guān)于uniapp藍(lán)牙連接的通用步驟,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-06-06
  • JavaScript 獲取事件對象的注意點

    JavaScript 獲取事件對象的注意點

    平時我們獲取事件對象一定要將firefox考慮進(jìn)去。
    2009-07-07
  • js運(yùn)算符的一些特殊用法

    js運(yùn)算符的一些特殊用法

    這篇文章主要介紹了js運(yùn)算符的一些特殊用法,需要的朋友可以參考下
    2018-07-07
  • javascript頭像上傳代碼實例

    javascript頭像上傳代碼實例

    這篇文章主要介紹了javascript頭像上傳代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 為超鏈接加上disabled后的故事

    為超鏈接加上disabled后的故事

    為超鏈接加上disabled后的故事,學(xué)習(xí)js的朋友可以參考下對超鏈接的一些控制。
    2010-12-12
  • 小程序數(shù)據(jù)通信方法大全(推薦)

    小程序數(shù)據(jù)通信方法大全(推薦)

    這篇文章主要介紹了小程序數(shù)據(jù)通信方法大全,文中詳細(xì)的介紹了小程序頁面、組件之間的三種關(guān)系進(jìn)行通信,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • 無廢話JavaScript教程(全集)

    無廢話JavaScript教程(全集)

    許多讀者認(rèn)為我那本《JavaScript語言精髓與編程實踐》讀來辛苦,所以我一直想寫個簡單的讀本。索性,這次就寫個最簡單的吧。
    2008-10-10
  • 在Monaco Editor中實現(xiàn)斷點設(shè)置的方法詳解

    在Monaco Editor中實現(xiàn)斷點設(shè)置的方法詳解

    Monaco Editor 是 vscode 等產(chǎn)品使用的代碼編輯器,功能強(qiáng)大(且復(fù)雜),由微軟維護(hù),本文在 React + TypeScript(Vite)框架下使用 @monaco-editor/react 并介紹開發(fā)斷點顯示時踩到的坑,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-04-04

最新評論

攀枝花市| 宁武县| 黑河市| 诸城市| 兰考县| 吕梁市| 马鞍山市| 黄大仙区| 永兴县| 类乌齐县| 咸丰县| 边坝县| 龙岩市| 潮安县| 息烽县| 东丽区| 威宁| 司法| 中宁县| 巍山| 贵定县| 迭部县| 吉木乃县| 新巴尔虎左旗| 安新县| 曲靖市| 阜阳市| 刚察县| 阳信县| 滦平县| 公安县| 合水县| 远安县| 屯昌县| 无极县| 中牟县| 都江堰市| 突泉县| 章丘市| 临湘市| 石棉县|