第三章全?;痭ode js6節(jié)鑒權koa實戰(zhàn)_第1頁
第三章全?;痭ode js6節(jié)鑒權koa實戰(zhàn)_第2頁
第三章全?;痭ode js6節(jié)鑒權koa實戰(zhàn)_第3頁
第三章全?;痭ode js6節(jié)鑒權koa實戰(zhàn)_第4頁
第三章全棧基石node js6節(jié)鑒權koa實戰(zhàn)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Koa實戰(zhàn)- 方式(0:00-consthttp=require("http").createServer((req,res){if(req.url===}//觀 //:',)',oHeaderSet- consthttp=require("http")constsession={}.createServer((req,res)=>//觀 :',)constsessionKey='sid' .indexOf(sessionKey)>-1){res.end('ComeBack')//constpattern=newRegExp(`${sessionKey}=([^;]+);?\s*`)constsid=pattern.exec( consoleconsole.log('session:',sid,session}elseconstsid=(Math.random() ',`${sessionKey}=${sid};`)session[sid]={name:'laowang'} } 服務器在接受客戶端首次 時在服務器端創(chuàng)建sesion,然后保存ssio(我們可以將sesion保存在內(nèi)存中,也可以保存在eis中,推薦使用后者),然后給這個session個唯一的標識字符串然后在響應頭中種下這個唯一標識字符串。 下 哈希Hash-SHA--把一個不定 -xialaoshi->x4sdfdsafsdafl3s3-對稱koa中的session使用:npmikoa-session-////constkoa=require('koa')constapp=newkoa()constsession=require('koa-//簽名keykeys作用用來 進行簽app.keys=['someconstSESS_CONFIG={key:'kkb:sess', //httpOnly:true,//signed:true,//app.use(session(SESS_CONFIG,//app.use(ctx=>if(ctx.path==='/favicon.ico')//letn=ctx.session.count||//ctx.session.count=++n;ctx.body='第'+n+'次 rediseis使用。Ris不僅僅支持簡單的key-vale類型的數(shù)據(jù),同時還提供st,st,zst,ash等數(shù)據(jù)結(jié)構的。Redis性能極高–Redis能讀的速度是110000次/s,寫的速度是81000次/s豐富的數(shù)據(jù)類型–Redis支持二進制案例的Strings,Lists,Hashes,Sets及OrderedSets數(shù)–Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個操豐富的特性–Redis還支持publish/subscribe,通知,key////constredis==o','Thisisao',function{console.log("redisgetnpmi-Skoa-////koa-constredisStore=require('koa-redis');constredis=require('redis')const = (6379,constwrapper=require('co-redis'); =wrapper(redis store: })//},app.use(async(ctx,next)=>constkeys=await keys.forEach(asynckey=> )await為什么要將 ////<scriptsrc="<script <div<inputv-<inputv-<buttonv-<buttonv-<buttonv-<buttononclick=".geementById('log').innerHTML=''">Clear<h6axios.defaults.withCredentials=trueresponsereturnresponse;}varapp=Vue({el:'#app',data:{username:'test',password:'test'methods:asynclogin()await{username:this.username,password:this.passwordasynclogout()awaitasyncgetUser()await}}constKoa=constrouter=require('koa-router')()constsession=require('koa-session')constcors=require('koa2-cors')constbodyParser=require('koa-bodyparser')conststatic=require('koa-static')constapp=newcredentials:app.keys=['someapp.use(static(dirname+'/'));app.use((ctx,next)=>if(ctx.url.indexOf('login')>-{}elseconsole.log('session',ctx.session.userinfo)if(!ctx.session.userinfo){ctx.body=message:"登錄失敗}}else}}router.post('/users/login',async(ctx){const}=ctx.requestctx.session.userinfo=body.username;ctx.body={message:"登錄成功}router.post('/users/logout',async(ctx)=>deletectx.session.userinfoctx.body={message:"登出系統(tǒng)}router.get('/users/getUser',async(ctx){ctx.body=message:"獲取數(shù)據(jù)成功userinfo:}} 不靈活如果APP該怎么辦跨域怎么辦 驗證成功后,服務端會簽發(fā)一個令牌(Token),再把這個Token客戶端收到Token以后可以把 起來,比如放 里或者LocalStorage客戶端每次向服務端請求資源的時候需要帶著服務端簽發(fā)的服務端收到請求,然后去驗證客戶端請求里面帶著的Token,如果驗證成功,就向客戶端返回請<scriptsrc="<script <div<inputv-model="username"<inputv-model="password"<buttonv-<buttonv-<buttonv-<button@click="logs=[]">Clear<!--日志<liv-for="(log,idx)inlogs"{{logconfig=>if(token){//判斷是否存在token,如果存在的話,則每個httpheader都加上//Bearer是JWTmon["Authorization"]="Bearer"+}returnerr=>return}se=>{returnresponse;err{return}varvarapp=newVue({el:"#app",data:{logs:[]methods:login:asyncfunction()constres=awaitaxios.post("/users/login-{username:this.username,password:this.passwordlocalStorage.setItem("token",logout:async{getUser:asyncfunction()awaitaxios.get("/users/getUser-}}npmijsonwebtokenkoa-jwt-constconstKoa=constrouter=require('koa-constjwt=require("jsonwebtoken")constjwtAuth=require("koa-jwt")constsecret="it'sasecret"constcors=require('koa2-cors')constbodyParser=require('koa-bodyparser')conststatic=require('koa-static')constapp=newKoa();app.keys=['somesecret'];app.use(static(dirname+'/'));router.post("/users/login-token",asyncctx{const{body}=constuserinfo=body.username;ctx.body={message:"登錄成功user:////生成tokentoken:{data://設置tokenexp:Math.floor(Date.now()/1000)+60*)er-token",jwtAuth({asyncctx=>//驗證通過,state.userctx.body=message:"獲取數(shù)據(jù)成功userinfo:}sssion要求服務端信息,并且根據(jù)d能夠檢索,而toen不需要(因為信息就在toen中,這樣實現(xiàn)了服務端無狀態(tài)化)。在大規(guī)模系統(tǒng)中,對每個請求都檢索會話信息可能是一個復雜和耗時的過程。但另外一方面服務端要通過toen來解析用戶也需要定義好相應的協(xié)議(比如JWT)。 token的生成方式更加多樣化,可以由第模塊來提供。JWTJSONWEBTOKEN)原理解析(1:40:50-BearerToken包含三個組成部分:令牌頭、payload、哈希簽名:默認使用base64對ayload編碼,使用hs256算法對令牌頭、payload和密鑰進行簽名生成哈希////constsecret=' constopt=secret:'jwt_secret',key:'user'}constuser{username:'abc',password:'111111'}consttokenjsonwebtoken.sign({data://設置tokenexp:Math.floor(Date.now()/1000)+(60*},console.log('生成token:'+//生成 :',jsonwebtoken.verify(token,secret,:{data:{username:'abc',password:'111111',}HMACHshMssageAuthenicionCode,散列消息鑒別碼,基于密鑰的Hsh算法的認證協(xié)議。消息鑒別碼實現(xiàn)鑒別的原理是,用公開函數(shù)和密鑰產(chǎn)生一個固定長度的值作為認證標識,用這個標識鑒別消息的完整性。使用一個密鑰生成一個固定大小的小數(shù)據(jù)塊,即AC,并將其加入到消息中,然后傳輸。接收方利用與發(fā)送方共享的密鑰進行鑒別認證等。按照RFC2045的定義,Bse64被定義為:Bs64內(nèi)容傳送編碼被設計用來把任意序列的描述為一種不易直接識別的形式。(TeBase64otntasfr-Enoingisesignedtoesentiysequencesfoctsinamhtneedotbehumanlyedal.)常見于郵件、htt加密,截取htt信息,你就會發(fā)現(xiàn)登錄操作的用戶名、字段通過BASE64編碼的 阮一峰JWT解釋 OAuth(開放)(1:55:30-概述:登入主要基于Auth20。Aut協(xié)議為用戶資源的提供了一個安全的、開放而又簡易的標準。與以往的方式不同之處是AUH的不會使第觸及到用戶的帳號信息(如用戶名與),即第無需使用用戶的用戶名與就可以申請獲得該用戶資源的,因此AUH是安全的。案例:OAuth<script<script<script<div<a/login'>login登錄接口constconstKoa=constrouter=require('koa-router')()conststatic=req

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論