91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在koa中利用jwt實現token驗證與刷新功能

發布時間:2021-05-22 17:39:51 來源:億速云 閱讀:545 作者:Leah 欄目:web開發

今天就跟大家聊聊有關怎么在koa中利用jwt實現token驗證與刷新功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

JWT

JSON Web Token (JWT)是一個開放標準(RFC 7519),它定義了一種緊湊的、自包含的方式,用于作為JSON對象在各方之間安全地傳輸信息。該信息可以被驗證和信任,因為它是數字簽名的。

本文只講Koa2 + jwt的使用,不了解JWT的話請到這里)進行了解。

koa環境

要使用koa2+jwt需要先有個koa的空環境,搭環境比較麻煩,我直接使用koa起手式,這是我使用koa+typescript搭建的空環境,如果你也經常用koa寫寫小demo,可以點個star,方便~

安裝koa-jwt

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

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

上面代碼中,除了登錄、注冊接口不需要jwt驗證,其他請求都需要。

使用jsonwebtoken生成、驗證token

執行npm install jsonwebtoken安裝jsonwebtoken

相關代碼:

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來生成一個token,

參數意義:

  • payload:載體,一般把用戶信息作為載體來生成token

  • secret:秘鑰,可以是字符串也可以是文件

  • expiresIn:過期時間 1h表示一小時

在登錄中返回token

import * as crypto from 'crypto';
import * as jwt from 'jsonwebtoken';
async login(ctx){
 //從數據庫中查找對應用戶
 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' });
  //響應到前端
  ctx.body = {
   token
  }
 }
}

前端攔截器

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

這里以axios請求為例,在發送請求時,通過請求攔截器把token塞到header里:

//請求攔截器
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);
 }
);

服務端處理前端發送過來的Token
前端發送請求攜帶token,后端需要判斷以下幾點:

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

關于上面兩點,需要在后端寫一個中間件來完成:

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方法驗證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;
  }});
 });

上面中間件是需要驗證token時都需要走這里,可以理解為攔截器,在這個攔截器中處理判斷token是否正確及是否過期,并作出相應處理。

后端刷新token 前端需要更新token
后端更換新token后,前端也需要獲取新token 這樣請求才不會報錯。

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

依然以axios為例:

//響應攔截器
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則到登錄頁
   if (status == 401 || status == 405) {
    history.push('/login');
   }
  }
  return Promise.reject(error);
 }
);

看完上述內容,你們對怎么在koa中利用jwt實現token驗證與刷新功能有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

营口市| 抚松县| 建德市| 利辛县| 杭锦后旗| 镇巴县| 许昌市| 社会| 绵竹市| 宁蒗| 泗洪县| 白水县| 溧阳市| 桑日县| 墨江| 陈巴尔虎旗| 合阳县| 钟山县| 富民县| 涞源县| 秀山| 绥德县| 瓮安县| 梁平县| 崇文区| 平山县| 临泽县| 建水县| 长沙县| 四子王旗| 都安| 罗田县| 宁夏| 黑龙江省| 密云县| 普定县| 双桥区| 包头市| 上饶市| 黄龙县| 历史|