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

koa+jwt實(shí)現(xiàn)token驗(yàn)證與刷新功能

 更新時(shí)間:2019年05月30日 14:48:47   作者:alwaysVe  
這篇文章主要介紹了koa+jwt實(shí)現(xiàn)token驗(yàn)證與刷新功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

JWT

JSON Web Token (JWT)是一個(gè)開放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊的、自包含的方式,用于作為JSON對(duì)象在各方之間安全地傳輸信息。該信息可以被驗(yàn)證和信任,因?yàn)樗菙?shù)字簽名的。

本文只講Koa2 + jwt的使用,不了解JWT的話請(qǐng)到這里)進(jìn)行了解。

koa環(huán)境

要使用koa2+jwt需要先有個(gè)koa的空環(huán)境,搭環(huán)境比較麻煩,我直接使用koa起手式,這是我使用koa+typescript搭建的空環(huán)境,如果你也經(jīng)常用koa寫寫小demo,可以點(diǎn)個(gè)star,方便~

安裝koa-jwt

koa-jwt主要作用是控制哪些路由需要jwt驗(yàn)證,哪些接口不需要驗(yàn)證:

import * as koaJwt from 'koa-jwt';
//路由權(quán)限控制 除了path里的路徑不需要驗(yàn)證token 其他都要
app.use(
  koaJwt({
    secret: secret.sign
  }).unless({
    path: [/^\/login/, /^\/register/]
  })
);

上面代碼中,除了登錄、注冊(cè)接口不需要jwt驗(yàn)證,其他請(qǐng)求都需要。

使用jsonwebtoken生成、驗(yàn)證token

執(zhí)行npm install jsonwebtoken安裝jsonwebtoken

相關(guān)代碼:

import * as jwt from 'jsonwebtoken';
const secret = 'my_app_secret';
const payload = {user_name:'Jack', id:3, email: '1234@gmail.com'};
const token = jwt.sign(payload, secret, { expiresIn: '1h' });

上面代碼中通過jwt.sign來生成一個(gè)token,

參數(shù)意義:

  • payload:載體,一般把用戶信息作為載體來生成token
  • secret:秘鑰,可以是字符串也可以是文件
  • expiresIn:過期時(shí)間 1h表示一小時(shí)

在登錄中返回token

import * as crypto from 'crypto';
import * as jwt from 'jsonwebtoken';
async login(ctx){
 //從數(shù)據(jù)庫(kù)中查找對(duì)應(yīng)用戶
 const user = await userRespository.findOne({
  where: {
   name: user.name
  }
 });
 //密碼加密
 const psdMd5 = crypto
  .createHash('md5')
  .update(user.password)
  .digest('hex');
 //比較密碼的md5值是否一致 若一致則生成token并返回給前端
 if (user.password === psdMd5) {
  //生成token
  token = jwt.sign(user, secret, { expiresIn: '1h' });
  //響應(yīng)到前端
  ctx.body = {
   token
  }
 }
}

前端攔截器

前端通過登錄拿到返回過來的token,可以將它存在localStorage里,然后再以后的請(qǐng)求中把token放在請(qǐng)求頭的Authorization里帶給服務(wù)端。

這里以axios請(qǐng)求為例,在發(fā)送請(qǐng)求時(shí),通過請(qǐng)求攔截器把token塞到header里:

//請(qǐng)求攔截器
axios.interceptors.request.use(function(config) {
  //從localStorage里取出token
  const token = localStorage.getItem('tokenName');
  //把token塞入Authorization里
  config.headers.Authorization = `Bearer ${token}`;
  
  return config;
 },
 function(error) {
  // Do something with request error
  return Promise.reject(error);
 }
);

服務(wù)端處理前端發(fā)送過來的Token
前端發(fā)送請(qǐng)求攜帶token,后端需要判斷以下幾點(diǎn):

token是否正確,不正確則返回錯(cuò)誤
token是否過期,過期則刷新token 或返回401表示需要從新登錄

關(guān)于上面兩點(diǎn),需要在后端寫一個(gè)中間件來完成:

app.use((ctx, next) => {
 if (ctx.header && ctx.header.authorization) {
  const parts = ctx.header.authorization.split(' ');
  if (parts.length === 2) {
   //取出token
   const scheme = parts[0];
   const token = parts[1];
   if (/^Bearer$/i.test(scheme)) {
    try {
     //jwt.verify方法驗(yàn)證token是否有效
     jwt.verify(token, secret.sign, {
      complete: true
     });
    } catch (error) {
     //token過期 生成新的token
     const newToken = getToken(user);
     //將新token放入Authorization中返回給前端
     ctx.res.setHeader('Authorization', newToken);
    }
   }
  }
 }
 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;
  }});
 }); 

上面中間件是需要驗(yàn)證token時(shí)都需要走這里,可以理解為攔截器,在這個(gè)攔截器中處理判斷token是否正確及是否過期,并作出相應(yīng)處理。

后端刷新token 前端需要更新token
后端更換新token后,前端也需要獲取新token 這樣請(qǐng)求才不會(huì)報(bào)錯(cuò)。

由于后端更新的token是在響應(yīng)頭里,所以前端需要在響應(yīng)攔截器中獲取新token。

依然以axios為例:

//響應(yīng)攔截器
axios.interceptors.response.use(function(response) {
  //獲取更新的token
  const { authorization } = response.headers;
  //如果token存在則存在localStorage
  authorization && localStorage.setItem('tokenName', authorization);
  return response;
 },
 function(error) {
  if (error.response) {
   const { status } = error.response;
   //如果401或405則到登錄頁(yè)
   if (status == 401 || status == 405) {
    history.push('/login');
   }
  }
  return Promise.reject(error);
 }
);

總結(jié)

以上所述是小編給大家介紹的koa+jwt實(shí)現(xiàn)token驗(yàn)證與刷新功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 教你用十行node.js代碼讀取docx的文本

    教你用十行node.js代碼讀取docx的文本

    這篇文章主要給大家介紹了用十行node.js代碼讀取docx文本的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • 使用Node.js的readline模塊逐行讀取并解析大文件

    使用Node.js的readline模塊逐行讀取并解析大文件

    在Node.js環(huán)境中處理大文件是一個(gè)常見的需求,尤其是在處理日志文件、數(shù)據(jù)庫(kù)導(dǎo)出、或任何形式的大規(guī)模文本數(shù)據(jù)時(shí),本文將深入探討如何使用Node.js的readline模塊來實(shí)現(xiàn)這一功能,并討論相關(guān)的性能優(yōu)化和注意事項(xiàng),需要的朋友可以參考下
    2024-09-09
  • Node.js中的cluster模塊深入解讀

    Node.js中的cluster模塊深入解讀

    NodeJS引入了Cluster模塊試圖簡(jiǎn)化這些體力勞動(dòng),使用Cluster模塊可以運(yùn)行并管理多個(gè)實(shí)例進(jìn)程,下面這篇文章主要給大家介紹了關(guān)于Node.js中cluster模塊的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-06-06
  • 詳解Node.js一行命令上傳本地文件到服務(wù)器

    詳解Node.js一行命令上傳本地文件到服務(wù)器

    這篇文章主要介紹了Node.js一行命令上傳本地文件到服務(wù)器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 利用Mongoose讓JSON數(shù)據(jù)直接插入或更新到MongoDB

    利用Mongoose讓JSON數(shù)據(jù)直接插入或更新到MongoDB

    這篇文章主要給大家介紹了利用Mongoose讓JSON數(shù)據(jù)直接插入或更新到MongoDB數(shù)據(jù)庫(kù)的相關(guān)資料,文中詳細(xì)介紹了配置Mongoose、創(chuàng)建目錄及文件、插入數(shù)據(jù),POST提交JSON增加一條記錄以及詢數(shù)據(jù),取出剛增加的記錄等內(nèi)容,需要的朋友可以參考下。
    2017-05-05
  • node-red File讀取好保存實(shí)例講解

    node-red File讀取好保存實(shí)例講解

    在本篇文章里小編給大家整理了關(guān)于node-red File讀取好保存的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以參考下。
    2019-09-09
  • Node.js實(shí)現(xiàn)用戶評(píng)論社區(qū)功能(體驗(yàn)前后端開發(fā)的樂趣)

    Node.js實(shí)現(xiàn)用戶評(píng)論社區(qū)功能(體驗(yàn)前后端開發(fā)的樂趣)

    這篇文章主要介紹了Node.js實(shí)現(xiàn)用戶評(píng)論社區(qū)(體驗(yàn)前后端開發(fā)的樂趣) ,需要的朋友可以參考下
    2019-05-05
  • Nodejs使用mysql2操作數(shù)據(jù)庫(kù)的方法完整講解

    Nodejs使用mysql2操作數(shù)據(jù)庫(kù)的方法完整講解

    MySQL2是一個(gè)基于Node.js的MySQL數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,它是MySQL官方推薦的驅(qū)動(dòng)之一,下面這篇文章主要給大家介紹了關(guān)于Nodejs使用mysql2操作數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • nodejs制作一個(gè)文檔同步工具自動(dòng)同步到gitee中的實(shí)現(xiàn)代碼

    nodejs制作一個(gè)文檔同步工具自動(dòng)同步到gitee中的實(shí)現(xiàn)代碼

    這篇文章主要介紹了nodejs制作一個(gè)文檔同步工具自動(dòng)同步到gitee中,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Nodejs Express4.x開發(fā)框架隨手筆記

    Nodejs Express4.x開發(fā)框架隨手筆記

    Express: ?web application framework for?Node.js?Express 是一個(gè)簡(jiǎn)潔、靈活的 node.js Web 應(yīng)用開發(fā)框架, 它提供一系列強(qiáng)大的特性,幫助你創(chuàng)建各種 Web 和移動(dòng)設(shè)備應(yīng)用,本篇文章給大家介紹nodejs express4.x開發(fā)框架隨手筆記,感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11

最新評(píng)論

黄石市| 行唐县| 平邑县| 泰来县| 文安县| 和顺县| 潍坊市| 江山市| 海淀区| 类乌齐县| 信宜市| 鹤岗市| 略阳县| 建水县| 博罗县| 徐汇区| 长泰县| 巴马| 兖州市| 三都| 清苑县| 临沭县| 泰安市| 宁武县| 鹤山市| 商南县| 濮阳市| 旬邑县| 汶上县| 乌拉特前旗| 茂名市| 太仓市| 杭州市| 开化县| 祥云县| 贵州省| 佛坪县| 桐庐县| 青河县| 紫阳县| 义乌市|