第三章全栈基石node js6节鉴权koa实战_第1页
第三章全栈基石node js6节鉴权koa实战_第2页
第三章全栈基石node js6节鉴权koa实战_第3页
第三章全栈基石node js6节鉴权koa实战_第4页
第三章全栈基石node js6节鉴权koa实战_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Koa实战- 方式(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'} } 服务器在接受客户端首次 时在服务器端创建sesion,然后保存ssio(我们可以将sesion保存在内存中,也可以保存在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类型的数据,同时还提供st,st,zst,ash等数据结构的。Redis性能极高–Redis能读的速度是110000次/s,写的速度是81000次/s丰富的数据类型–Redis支持二进制案例的Strings,Lists,Hashes,Sets及OrderedSets数–Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操丰富的特性–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:"登出系统}router.get('/users/getUser',async(ctx){ctx.body=message:"获取数据成功userinfo:}} 不灵活如果APP该怎么办跨域怎么办 验证成功后,服务端会签发一个令牌(Token),再把这个Token客户端收到Token以后可以把 起来,比如放 里或者LocalStorage客户端每次向服务端请求资源的时候需要带着服务端签发的服务端收到请求,然后去验证客户端请求里面带着的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:"获取数据成功userinfo:}sssion要求服务端信息,并且根据d能够检索,而toen不需要(因为信息就在toen中,这样实现了服务端无状态化)。在大规模系统中,对每个请求都检索会话信息可能是一个复杂和耗时的过程。但另外一方面服务端要通过toen来解析用户也需要定义好相应的协议(比如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算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即AC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。按照RFC2045的定义,Bse64被定义为:Bs64内容传送编码被设计用来把任意序列的描述为一种不易直接识别的形式。(TeBase64otntasfr-Enoingisesignedtoesentiysequencesfoctsinamhtneedotbehumanlyedal.)常见于邮件、htt加密,截取htt信息,你就会发现登录操作的用户名、字段通过BASE64编码的 阮一峰JWT解释 OAuth(开放)(1:55:30-概述:登入主要基于Auth20。Aut协议为用户资源的提供了一个安全的、开放而又简易的标准。与以往的方式不同之处是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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论