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

首頁 > 開發 > JS > 正文

node實現基于token的身份驗證

2024-05-06 16:43:40
字體:
來源:轉載
供稿:網友

最近研究了下基于token身份驗證,并將這種機制整合在個人項目中?,F在很多網站的認證方式都從傳統的seesion+cookie轉向token校驗。對比傳統的校驗方式,token確實有更好的擴展性與安全性。

傳統的session+cookie身份驗證

由于HTTP是無狀態的,它并不記錄用戶的身份。用戶將賬號與密碼發送給服務器后,后臺通過校驗,但是并沒有記錄狀態,于是下一次用戶的請求仍然需要校驗身份。為了解決這一問題,需要在服務端生成一條包含用戶身份的記錄,也就是session,再將這條記錄發送給用戶并存儲在用戶本地,即cookie。接下來用戶的請求都會帶上這條cookie,若客戶端的cookie與服務端的session能對應上,則說明用戶身份驗證通過。

token身份校驗

流程大致如下:

  1. 第一次請求時,用戶發送賬號與密碼
  2. 后臺校驗通過,則會生成一個有時效性的token,再將此token發送給用戶
  3. 用戶獲得token后,將此token存儲在本地,一般存儲在localstorage或cookie
  4. 之后的每次請求都會將此token添加在請求頭里,所有需要校驗身份的接口都會被校驗token,若token解析后的數據包含用戶身份信息,則身份驗證通過。

對比傳統的校驗方式,token校驗有如下優勢:

  1. 在基于token的認證,token通過請求頭傳輸,而不是把認證信息存儲在session或者cookie中。這意味著無狀態。你可以從任意一種可以發送HTTP請求的終端向服務器發送請求。
  2. 可以避免CSRF攻擊
  3. 當在應用中進行 session的讀,寫或者刪除操作時,會有一個文件操作發生在操作系統的temp 文件夾下,至少在第一次時。假設有多臺服務器并且 session 在第一臺服務上創建。當你再次發送請求并且這個請求落在另一臺服務器上,session 信息并不存在并且會獲得一個“未認證”的響應。我知道,你可以通過一個粘性 session 解決這個問題。然而,在基于 token 的認證中,這個問題很自然就被解決了。沒有粘性 session 的問題,因為在每個發送到服務器的請求中這個請求的 token 都會被攔截。

下面介紹一下利用node+jwt(jwt教程)搭建簡易的token身份校驗

示例

當用戶第一次登錄時,提交賬號與密碼至服務器,服務器校驗通過,則生成對應的token,代碼如下:

const fs = require('fs');const path = require('path');const jwt = require('jsonwebtoken');//生成token的方法function generateToken(data){  let created = Math.floor(Date.now() / 1000);  let cert = fs.readFileSync(path.join(__dirname, '../config/pri.pem'));//私鑰  let token = jwt.sign({    data,    exp: created + 3600 * 24  }, cert, {algorithm: 'RS256'});  return token;}//登錄接口router.post('/oa/login', async (ctx, next) => {  let data = ctx.request.body;  let {name, password} = data;  let sql = 'SELECT uid FROM t_user WHERE name=? and password=? and is_delete=0', value = [name, md5(password)];  await db.query(sql, value).then(res => {    if (res && res.length > 0) {      let val = res[0];      let uid = val['uid'];      let token = generateToken({uid});      ctx.body = {        ...Tips[0], data: {token}      }    } else {      ctx.body = Tips[1006];    }  }).catch(e => {    ctx.body = Tips[1002];  });});

用戶通過校驗將獲取到的token存放在本地:

store.set('loginedtoken',token);//store為插件

之后客戶端請求需要驗證身份的接口,都會將token放在請求頭里傳遞給服務端:

service.interceptors.request.use(config => {  let params = config.params || {};  let loginedtoken = store.get('loginedtoken');  let time = Date.now();  let {headers} = config;  headers = {...headers,loginedtoken};  params = {...params,_:time};  config = {...config,params,headers};  return config;}, error => {  Promise.reject(error);})

服務端對所有需要登錄的接口均攔截token并校驗合法性。

function verifyToken(token){  let cert = fs.readFileSync(path.join(__dirname, '../config/pub.pem'));//公鑰  try{    let result = jwt.verify(token, cert, {algorithms: ['RS256']}) || {};    let {exp = 0} = result,current = Math.floor(Date.now()/1000);    if(current <= exp){      res = result.data || {};    }  }catch(e){  }  return res;}app.use(async(ctx, next) => {  let {url = ''} = ctx;  if(url.indexOf('/user/') > -1){//需要校驗登錄態    let header = ctx.request.header;    let {loginedtoken} = header;    if (loginedtoken) {      let result = verifyToken(loginedtoken);      let {uid} = result;      if(uid){        ctx.state = {uid};        await next();      }else{        return ctx.body = Tips[1005];      }    } else {      return ctx.body = Tips[1005];    }  }else{    await next();  }});

本示例使用的公鑰與私鑰可自己生成,操作如下:

  1. 打開命令行工具,輸入openssl,打開openssl;
  2. 生成私鑰:genrsa -out rsa_private_key.pem 2048
  3. 生成公鑰: rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

點此查看node后臺代碼
點此查看前端代碼

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日日骚久久av| 亚洲人成伊人成综合网久久久| 亚洲激情免费观看| 国产一区香蕉久久| 欧美裸体男粗大视频在线观看| 亚洲影院在线看| 色爱av美腿丝袜综合粉嫩av| 久久天天躁日日躁| 91精品国产成人www| 日本一区二区在线播放| 在线观看欧美成人| 久久久久999| 欧美夫妻性生活视频| 日韩视频免费观看| 欧美激情乱人伦一区| 久久99视频精品| 伊人伊成久久人综合网小说| 91精品中国老女人| 中文字幕亚洲色图| 中文一区二区视频| 亚洲久久久久久久久久久| 91av在线免费观看视频| 成人精品一区二区三区电影黑人| 国产成人精品视频在线| 国内精品小视频在线观看| 欧美日韩美女视频| 日韩av影院在线观看| 亚洲国产成人在线视频| 91色视频在线观看| 国产精品99久久久久久www| 亚洲mm色国产网站| 色妞欧美日韩在线| 国产精品视频永久免费播放| 亚洲综合日韩中文字幕v在线| 亚洲第一av网| 欧美韩国理论所午夜片917电影| 国产日本欧美一区| 日韩有码在线观看| 国产欧美日韩最新| 欧美视频免费在线| 亚洲视频日韩精品| 国产成人亚洲精品| 国产suv精品一区二区三区88区| 国产午夜精品麻豆| 久久视频在线直播| 欧洲成人在线观看| 国产精品久久在线观看| 国产午夜精品一区二区三区| 国模精品视频一区二区| 亚洲欧美激情另类校园| 日韩av在线网页| 成人免费xxxxx在线观看| 亚洲91精品在线| 日韩激情av在线免费观看| 欧美一级视频一区二区| 欧美日韩999| 91夜夜揉人人捏人人添红杏| 国产精品狠色婷| 亚洲va国产va天堂va久久| 亚洲国产小视频在线观看| 日韩有码在线电影| 亚洲午夜久久久影院| 国产精品第2页| 九九热精品视频在线播放| 九九久久国产精品| 日韩欧美在线国产| 日韩在线视频一区| 91干在线观看| 疯狂做受xxxx高潮欧美日本| 日韩有码在线电影| 2021久久精品国产99国产精品| 国产视频精品va久久久久久| 日韩美女激情视频| 波霸ol色综合久久| 日韩免费高清在线观看| 人人爽久久涩噜噜噜网站| 成人国产精品日本在线| 日韩av影片在线观看| 欧洲中文字幕国产精品| 欧美日韩国产一区中文午夜| 国产91色在线免费| 一区二区在线免费视频| 欧洲亚洲妇女av| 国产一区二区三区三区在线观看| 久久99亚洲精品| www.久久色.com| 久久久久久网址| 亚洲第五色综合网| 亚洲男人天堂2023| 热re99久久精品国产66热| 日韩精品在线视频| 国产精品户外野外| 理论片在线不卡免费观看| 在线性视频日韩欧美| 久久久国产在线视频| 国产精品久久av| 久久久亚洲福利精品午夜| 国产精品大片wwwwww| 中文字幕一精品亚洲无线一区| 亚洲性无码av在线| yellow中文字幕久久| 欧美孕妇毛茸茸xxxx| 国产精品视频999| 美女国内精品自产拍在线播放| 亚洲精品福利视频| 欧美黑人一级爽快片淫片高清| 国产精品国产三级国产专播精品人| 九九热精品视频| 久久免费国产视频| 久久99精品久久久久久噜噜| 国产大片精品免费永久看nba| 欧美性极品少妇精品网站| 午夜精品美女自拍福到在线| 久久精品亚洲94久久精品| 国产精品1区2区在线观看| 欧美一级大片在线观看| 亚洲女人天堂网| 日韩动漫免费观看电视剧高清| 综合网日日天干夜夜久久| 91久久在线播放| 亚洲专区国产精品| 中文字幕不卡在线视频极品| 欧美性生交xxxxxdddd| 成人深夜直播免费观看| 亚洲福利在线视频| 国产精品成人aaaaa网站| 成人在线观看视频网站| 日韩欧美大尺度| 国产精品视频免费在线观看| 亚洲女人天堂网| 日韩中文字幕亚洲| 9.1国产丝袜在线观看| 夜夜嗨av一区二区三区免费区| 91视频88av| 久久久精品2019中文字幕神马| 亚洲激情在线观看视频免费| 亚洲日韩中文字幕| 成人久久一区二区| 亚洲国产91精品在线观看| 91麻豆国产精品| 97碰碰碰免费色视频| 成人黄色免费片| 欧洲中文字幕国产精品| 国产婷婷97碰碰久久人人蜜臀| 欧美激情乱人伦一区| 亚洲国产欧美在线成人app| 亚洲精品一区中文字幕乱码| 亚洲免费人成在线视频观看| 日韩va亚洲va欧洲va国产| 欧美激情久久久久| 欧美在线视频在线播放完整版免费观看| 亚洲黄页视频免费观看| 黄色91在线观看| 久久久99免费视频| 国产精品入口日韩视频大尺度| 国产精品无码专区在线观看| 主播福利视频一区| 正在播放国产一区| 色多多国产成人永久免费网站| 国产午夜精品全部视频在线播放| 国产91精品黑色丝袜高跟鞋| 日韩禁在线播放| 米奇精品一区二区三区在线观看| 97超级碰碰碰久久久|