亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Node.js Koa2使用JWT進行鑒權的方法示例

2019-11-19 13:14:28
字體:
來源:轉載
供稿:網友

前言

在前后端分離的開發中,通過 Restful API 進行數據交互時,如果沒有對 API 進行保護,那么別人就可以很容易地獲取并調用這些 API 進行操作。那么服務器端要如何進行鑒權呢?

Json Web Token 簡稱為 JWT,它定義了一種用于簡潔、自包含的用于通信雙方之間以 JSON 對象的形式安全傳遞信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公鑰密鑰對進行簽名。

說得好像跟真的一樣,那么到底要怎么進行認證呢?

首先用戶登錄時,輸入用戶名和密碼后請求服務器登錄接口,服務器驗證用戶名密碼正確后,生成token并返回給前端,前端存儲token,并在后面的請求中把token帶在請求頭中傳給服務器,服務器驗證token有效,返回正確數據。

既然服務器端使用 Koa2 框架進行開發,除了要使用到 jsonwebtoken 庫之外,還要使用一個 koa-jwt 中間件,該中間件針對 Koa 對 jsonwebtoken 進行了封裝,使用起來更加方便。下面就來看看是如何使用的。

生成token

這里注冊了個 /login 的路由,用于用戶登錄時獲取token。

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;  if(!data.name || !data.password){    return ctx.body = {      code: '000002',      data: null,      msg: '參數不合法'    }  }  const result = await userModel.findOne({    name: data.name,    password: data.password  })  if(result !== null){    const token = jwt.sign({      name: result.name,      _id: result._id    }, 'my_token', { expiresIn: '2h' });    return ctx.body = {      code: '000001',      data: token,      msg: '登錄成功'    }  }else{    return ctx.body = {      code: '000002',      data: null,      msg: '用戶名或密碼錯誤'    }  }});module.exports = router;

在驗證了用戶名密碼正確之后,調用 jsonwebtoken 的 sign() 方法來生成token,接收三個參數,第一個是載荷,用于編碼后存儲在 token 中的數據,也是驗證 token 后可以拿到的數據;第二個是密鑰,自己定義的,驗證的時候也是要相同的密鑰才能解碼;第三個是options,可以設置 token 的過期時間。

獲取token

接下來就是前端獲取 token,這里是在 vue.js 中使用 axios 進行請求,請求成功之后拿到 token 保存到 localStorage 中。這里登錄成功后,還把當前時間存了起來,除了判斷 token 是否存在之外,還可以再簡單的判斷一下當前 token 是否過期,如果過期,則跳登錄頁面

submit(){  axios.post('/login', {    name: this.username,    password: this.password  }).then(res => {    if(res.code === '000001'){      localStorage.setItem('token', res.data);      localStorage.setItem('token_exp', new Date().getTime());      this.$router.push('/');    }else{      alert(res.msg);    }  })}

然后請求服務器端API的時候,把 token 帶在請求頭中傳給服務器進行驗證。每次請求都要獲取 localStorage 中的 token,這樣很麻煩,這里使用了 axios 的請求攔截器,對每次請求都進行了取 token 放到 headers 中的操作。

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

驗證token

通過 koa-jwt 中間件來進行驗證,用法也非常簡單

const koa = require('koa');const koajwt = require('koa-jwt');const app = new koa();// 錯誤處理app.use((ctx, next) => {  return next().catch((err) => {    if(err.status === 401){      ctx.status = 401;      ctx.body = 'Protected resource, use Authorization header to get access/n';    }else{      throw err;    }  })})app.use(koajwt({  secret: 'my_token'}).unless({  path: [///user//login/]}));

通過 app.use 來調用該中間件,并傳入密鑰 {secret: 'my_token'} ,unless 可以指定哪些 URL 不需要進行 token 驗證。token 驗證失敗的時候會拋出401錯誤,因此需要添加錯誤處理,而且要放在 app.use(koajwt()) 之前,否則不執行。

如果請求時沒有token或者token過期,則會返回401。

解析koa-jwt

我們上面使用 jsonwebtoken 的 sign() 方法來生成 token 的,那么 koa-jwt 做了些什么幫我們來驗證 token。

resolvers/auth-header.jsmodule.exports = function resolveAuthorizationHeader(ctx, opts) {  if (!ctx.header || !ctx.header.authorization) {    return;  }  const parts = ctx.header.authorization.split(' ');  if (parts.length === 2) {    const scheme = parts[0];    const credentials = parts[1];    if (/^Bearer$/i.test(scheme)) {      return credentials;    }  }  if (!opts.passthrough) {    ctx.throw(401, 'Bad Authorization header format. Format is "Authorization: Bearer <token>"');  }};

在 auth-header.js 中,判斷請求頭中是否帶了 authorization,如果有,將 token 從 authorization 中分離出來。如果沒有 authorization,則代表了客戶端沒有傳 token 到服務器,這時候就拋出 401 錯誤狀態。

verify.js

const jwt = require('jsonwebtoken');module.exports = (...args) => {  return new Promise((resolve, reject) => {    jwt.verify(...args, (error, decoded) => {      error ? reject(error) : resolve(decoded);    });  });};

在 verify.js 中,使用 jsonwebtoken 提供的 verify() 方法進行驗證返回結果。jsonwebtoken 的 sign() 方法來生成 token 的,而 verify() 方法則是用來認證和解析 token。如果 token 無效,則會在此方法被驗證出來。

index.js

const decodedToken = await verify(token, secret, opts);if (isRevoked) {  const tokenRevoked = await isRevoked(ctx, decodedToken, token);  if (tokenRevoked) {    throw new Error('Token revoked');  }}ctx.state[key] = decodedToken; // 這里的key = 'user'if (tokenKey) {  ctx.state[tokenKey] = token;}

在 index.js 中,調用 verify.js 的方法進行驗證并解析 token,拿到上面進行 sign() 的數據 {name: result.name, _id: result._id} ,并賦值給 ctx.state.user ,在控制器中便可以直接通過 ctx.state.user 拿到 name 和 _id 。

安全性

  • 如果 JWT 的加密密鑰泄露的話,那么就可以通過密鑰生成 token,隨意的請求 API 了。因此密鑰絕對不能存在前端代碼中,不然很容易就能被找到。
  • 在 HTTP 請求中,token 放在 header 中,中間者很容易可以通過抓包工具抓取到 header 里的數據。而 HTTPS 即使能被抓包,但是它是加密傳輸的,所以也拿不到 token,就會相對安全了。

總結

這上面就是 jwt 基本的流程,這或許不是最完美的,但在大多數登錄中使用已經足夠了。

上面的代碼可能不夠具體,這里使用 Koa + mongoose + vue.js 實現的一個例子 :jwt-demo ,可以做為參考。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本中文字幕成人| 亚洲综合社区网| 国产97在线|亚洲| 久久中文字幕视频| 色妞色视频一区二区三区四区| 自拍偷拍亚洲在线| 日本精品久久中文字幕佐佐木| 国产丝袜精品第一页| 在线亚洲午夜片av大片| 国产成人福利网站| 久久亚洲精品一区| 中文字幕亚洲无线码在线一区| 日日摸夜夜添一区| 98午夜经典影视| 亚洲va电影大全| 亚洲精品自拍第一页| 自拍偷拍亚洲一区| 中日韩美女免费视频网站在线观看| 狠狠躁18三区二区一区| 青青在线视频一区二区三区| 日韩在线精品一区| 亚洲成人黄色网址| 91精品在线播放| 亚洲第一二三四五区| 欧美色道久久88综合亚洲精品| 欧美另类老女人| 国产精品揄拍500视频| 日韩成人激情影院| 欧美在线观看网址综合| 欧美成人亚洲成人日韩成人| 九九精品视频在线| 亚洲成人动漫在线播放| 欧美一级淫片videoshd| 一区二区亚洲欧洲国产日韩| 欧美日韩国内自拍| 91精品国产沙发| 国产精品精品视频一区二区三区| 日韩欧美中文在线| 日本三级韩国三级久久| 久久天天躁夜夜躁狠狠躁2022| 亚洲视频一区二区| 爽爽爽爽爽爽爽成人免费观看| 国产成人精品视| 在线播放国产一区中文字幕剧情欧美| 欧美激情视频在线免费观看 欧美视频免费一| 国产成+人+综合+亚洲欧美丁香花| 国产欧美 在线欧美| 九九久久国产精品| 欧美大全免费观看电视剧大泉洋| 精品国产乱码久久久久酒店| 中文字幕亚洲综合久久| 国产原创欧美精品| 日韩精品视频在线播放| 国产一区二区三区视频| 91精品国产高清自在线| 色偷偷88888欧美精品久久久| www.亚洲男人天堂| 亚洲深夜福利网站| 在线观看国产欧美| 91精品国产九九九久久久亚洲| 欧美国产日韩一区二区在线观看| 午夜精品一区二区三区在线| 91精品久久久久久久久不口人| 国产欧美精品va在线观看| 亚洲香蕉成视频在线观看| 欧美日韩加勒比精品一区| 高跟丝袜欧美一区| 色多多国产成人永久免费网站| 日韩av毛片网| 色无极亚洲影院| 欧美成人午夜激情在线| 中文字幕精品一区久久久久| 久久成人18免费网站| 国产精品美女主播在线观看纯欲| 国产精品aaaa| 亚洲欧美日韩综合| 日本高清视频精品| 国产精品视频永久免费播放| 欧美天天综合色影久久精品| 欧美激情一二区| 久久亚洲一区二区三区四区五区高| wwwwwwww亚洲| 91香蕉电影院| 日韩国产欧美精品一区二区三区| 夜色77av精品影院| 91精品国产色综合久久不卡98| 日韩**中文字幕毛片| 91嫩草在线视频| 久久精品国产精品亚洲| 美女久久久久久久| 久久免费精品视频| 自拍偷拍亚洲欧美| 国产一区二区欧美日韩| 成人看片人aa| 性亚洲最疯狂xxxx高清| 成人免费观看49www在线观看| 国产不卡在线观看| 成人福利在线视频| 久久影视电视剧免费网站| 久久久亚洲天堂| 欧美美女操人视频| 国产日韩欧美成人| 欧美日韩国产成人在线观看| 日韩欧美国产一区二区| 国产欧美日韩中文| 中文字幕在线看视频国产欧美| 亚洲精品日韩丝袜精品| 欧美亚洲国产成人精品| 精品无码久久久久久国产| 一区二区欧美激情| 69**夜色精品国产69乱| 欧美大秀在线观看| 亚洲一区二区三区视频播放| 国产999精品视频| 亚洲欧洲黄色网| 欧美乱妇高清无乱码| 欧美激情一二区| 欧美成人精品在线| 欧美黑人极品猛少妇色xxxxx| 69久久夜色精品国产7777| 国产伦精品免费视频| 日日摸夜夜添一区| 欧美亚洲成人网| 97超级碰碰人国产在线观看| 最好看的2019年中文视频| 亚洲精品综合精品自拍| 日韩网站免费观看| 色偷偷88888欧美精品久久久| 粉嫩av一区二区三区免费野| 欧美日韩国产限制| 国产成人精品综合| 4438全国成人免费| 久久99视频精品| 国产一区二区三区在线播放免费观看| 久久久免费高清电视剧观看| 日本三级久久久| 欧美国产精品人人做人人爱| 中文字幕一精品亚洲无线一区| 亚洲国产女人aaa毛片在线| 亚洲国产91精品在线观看| 97视频国产在线| 欧美三级欧美成人高清www| 亚洲精品女av网站| 亚洲成人精品久久| 欧美视频免费在线| 国产精品久久久久久久久久新婚| 中文字幕亚洲欧美日韩高清| 国产精品27p| 中国日韩欧美久久久久久久久| 精品爽片免费看久久| 亚洲2020天天堂在线观看| 中文字幕av一区中文字幕天堂| 在线看片第一页欧美| 一本色道久久综合亚洲精品小说| 久久久天堂国产精品女人| 国产精品一久久香蕉国产线看观看| 91av免费观看91av精品在线| 在线观看精品国产视频| 裸体女人亚洲精品一区| 日韩电影免费在线观看| 国产中文字幕91| 91免费欧美精品| 亚洲无亚洲人成网站77777| 最好看的2019年中文视频|