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

詳解JWT與Token的應(yīng)用與原理

 更新時間:2023年04月18日 11:30:50   作者:coder_7  
這篇文章主要介紹了詳解JWT與Token的應(yīng)用與原理,JWT全稱“JSON Web Token”,是實現(xiàn)Token的機制,需要的朋友可以參考下

前言:JWT全稱“JSON Web Token”,是實現(xiàn)Token的機制。官網(wǎng):https://jwt.io/

JWT的應(yīng)用

  • JWT用于登錄身份驗證。
  • 用戶登錄成功后,后端通過JWT機制生成一個token,返回給客戶端。
  • 客戶端后續(xù)的每次請求都需要攜帶token,攜帶在authorization中。
  • 后端從authorization中拿到token后,通過secretKey進行解密驗證身份。

Token的組成原理

JWT生成的Token由三部分組成:header payload signature

  • header
    • alg:指定signature采用的加密算法,默認是HS256,對稱加密(加密和解密的密鑰相同)
    • typ:固定值,通常是JWT
    • 通過base64Url算法進行編碼
  • payload
    • 用戶id和name
    • 默認攜帶iat,令牌簽發(fā)時間(時間戳)
    • exp設(shè)置令牌過期時間
    • 通過base64Url算法進行編碼
  • signature
    • 設(shè)置一個secretKey,通過將前兩個結(jié)果合并后進行HS256算法
    • signature的組成:HS256(baseUrl64(header)+'.'+baseUrl(payload)+','+secretKey)
    • secreKey一定不能暴露,因為可以頒發(fā)token,也可以解密

采用HS256對稱加密生成的Token(https://jwt.io/)

在這里插入圖片描述

JWT對稱加密

JWT默認使用的是HS256對稱加密,其中secretKey是密鑰,意味著公鑰和私鑰都是同一個,這樣安全性不高。

例如在分布式服務(wù)中,其他系統(tǒng)服務(wù)器雖然可以用secretKey驗證token,但是這樣不安全,因為采用的是對稱加密算法,每個服務(wù)器都可以通secretKey頒發(fā)token,黑客只要攻破任何一個服務(wù)器就可以拿到secretKey。

在這里插入圖片描述

JWT非對稱加密

所以我們需要使用非對稱加密,加密和解密的密鑰不一致。加密密鑰稱為“私鑰”,解密密鑰稱為“公鑰”。

在這里插入圖片描述

采用RS256非對稱加密生成的Token(https://jwt.io/)

在這里插入圖片描述

生成私鑰和公鑰

mac電腦直接使用終端

windows電腦安裝git,使用git bash終端。

  • 輸入openssl
  • 輸入genrsa -out private.key 2048生成私鑰
  • 輸入rsa -in private.key -pubout -out public.key生成公鑰

代碼中加密使用的算法需要修改為RS256非對稱加密算法(注意:RS256最小密鑰大小為2048位)

nodejs中實現(xiàn)JWT(token非對稱加密)

const Koa = require('koa')
const KoaRouter = require('@koa/router')
const jwt = require('jsonwebtoken');
const fs = require('fs')

const app = new Koa();
const loginRouter = new KoaRouter({ prefix: '/login' })
const usersRouter = new KoaRouter({ prefix: '/users' })

const privateKey = fs.readFileSync('./keys/private.key')
const publicKey = fs.readFileSync('./keys/public.key')
// login接口
loginRouter.post('/', (ctx, next) => {
  const payload = { id: 1, name: 'zjc' }
  const token = jwt.sign(payload, privateKey, {
    expiresIn: 3000,
    algorithm: 'RS256'
  })
  ctx.body = {
    message: '登錄成功',
    code: 200,
    token
  }
})
// users接口
usersRouter.get('/', (ctx, next) => {
  const token = ctx.header.authorization.replace('Bearer ', '')
  console.log(token);
  try {
    // 驗證token
    jwt.verify(token, publicKey)
    ctx.body = {
      code: 200,
      data: ['xx', 'yy']
    }
  } catch (error) {
    ctx.body = {
      code: -1001,
      message: 'token無效'
    }
  }

})

app.use(loginRouter.routes())
app.use(usersRouter.routes())
app.listen(8000, () => {
  console.log('服務(wù)器啟動成功');
})

到此這篇關(guān)于詳解JWT與Token的應(yīng)用與原理的文章就介紹到這了,更多相關(guān)JWT與Token應(yīng)用與原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

大冶市| 天全县| 治县。| 兴海县| 澳门| 新宁县| 永顺县| 泰和县| 潢川县| 嘉祥县| 万年县| 郁南县| 东方市| 崇文区| 马山县| 孙吴县| 洪江市| 梧州市| 新田县| 大兴区| 邻水| 三门峡市| 剑阁县| 岳阳市| 夏津县| 德江县| 安义县| 于田县| 博客| 张家川| 河东区| 宜阳县| 嘉禾县| 合肥市| 张家川| 灵川县| 元氏县| 吉林市| 涞源县| 个旧市| 武城县|