课件第四章6节nodejs06鉴权_第1页
课件第四章6节nodejs06鉴权_第2页
课件第四章6节nodejs06鉴权_第3页
课件第四章6节nodejs06鉴权_第4页
课件第四章6节nodejs06鉴权_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

Koa实战- 方原理.createServer((req,res){if(req.url===}//观 设:',)',oHeaderSet- session的原理解constsession={}.createServer((req,res)=>//观 :',)constsessionKey='sid' 1){res.end('ComeBack')//constpattern=newconstsid= consoleconsole.log('session:',sid,session}elseconstsid=(Math.random() ',`${sessionKey}=${sid};`)session[sid]={name:'laowang'} } ssion会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)息。原实现原理服务器在接受客户端首次时在服务器端创建seesion,然后保存seesion(我们可以将seeion保存在内存中,也可以保存在edis中,推荐使用后者),然后给这个sesion个唯一的标识字符串,然后在响应头中种下这个唯一标识字符串。签名。这一步通过秘钥对sid进行签名处理,避免客户端修改sid。(非必需步骤浏览器中收到请求响应的时候会解析响应头,然后将sid保存在本 中,浏览器在下http请求的请求头中会带上该下 信息 哈希HashSHA yanglaoshi->对称非对称koa中的session使用npmikoa-session-////constapp=newkoa()constsession=require('koa- 进行签app.keys=['someconstSESS_CONFIG={key:'kkb:sess',键 ,//有效期httpOnlytrue仅服务器修signedtrue签app.use(session(SESS_CONFIG,测app.use(ctx=>获letn=ctx.session.count||设ctx.session.count=++n;ctx.body='第'+n+'次 #####使用 -是一个高性能的key-valueRedis与其他keyvalue缓存产品有以下三个特点Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash。-Redis支持数据的备份,即master-slaveRedis优性能极高性能极高–Redis能读的速度是110000次/s,写的速度是81000次/sRedisStrings,Lists,Hashes,SetsOrderedSets数据类型操作。原子–Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子//constredis==o','Thisisao',function{console.log("redisget安装npmi-Skoa-配置使用////koa-constredis=require('redis')const = (6379, =wrapper(redis store: })//},app.use(async(ctx,next)=>constkeys=await keys.forEach(asynckey=> )await为什么要将session在外部session-方//<scriptsrc="<script <div<inputv-<inputv-<buttonv-<buttonv-<buttonv-<buttononclick=".geementById('log').innerHTML=''">Clear<h6axios.defaults.withCredentials=trueresponsereturnresponse;}varapp=Vue({el:'#app',data:{password:'test'methods:asynclogin(){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=newapp.keys=['someapp.use(static(dirname+'/'));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)=>ctx.body={messagemessage:"登出系统}router.get('/users/getUser',async(ctx){ctx.body=message:"获取数据成功",userinfo:ctx.session.userinfo}过程回顾 服务端通过会话标识可以获取到会话相关的信息,然后对客户端的请求进行响应;如果找不到有效的会话,那么认为用户是未登陆状态会话会有过期时间,也可以通过一些操作(比如登出)来主动Token验session服务器有状不灵活如果APP该怎么办跨域怎么原 4.客户端收到Token以后可以把 起来,比如放Token里或者LocalStorage 服务端收到请求,然后去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请案例:令牌登录<script<script<div<buttonv-<buttonv-<buttonv-<button@click="logs=[]">Clear日志<liv-for="(log,idx)inlogs"{{logconfig=>if(token){//判断是否存在token,如果存在的话,则每个httpheader都加上Bearer是JWT的认证头部信mon["Authorization"]="Bearer"+}returnerr=>return}se=>{returnresponse;errreturnPromise.reject(err);}varapp=newVue({el:"#app",data:{username:"test",password:"test",logs:[]methods:login:asyncfunction()constres=awaitaxios.post("/users/login-{username:this.username,password:this.passwordlocalStorage.setItem("token",logout:asyncfunction(){getUser:asyncfunction()awaitaxios.get("/users/getUser-}}登录接安装依npmijsonwebtokenkoa-jwt-接口编constKoa=constrouter=require('koa-constjwt=require("jsonwebtoken")constjwtAuth=require("koa-jwt")constsecret="it'sasecret"constcors=require('koa2-cors')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:生成token返回给客token:{data://设置token过期时间,一小时后,秒为单exp:Math.floor(Date.now()/1000)+60*)router.get("/users/getUser-token",jwtAuth({asyncctx=>//验证通过,state.userctx.bodymessage:"获取数据成功",}服务端解析token获取用户信息,并响应用户的token会有过期时间,客户端登出的时候也会废弃token,但是服务端不需要任何ssion要求服务端信息,并且根据id能够检索,而oen不需要(因为信息就在oen中,这样实现了服务端无状态化)。在大规模系统中,对每个请求都检索会话信息可能是一个复杂和耗时的过程。但另外一方面服务端要通过oen来解析用户也需要定义好相应的协议(比如JWT)。 token若用,服务端无法感知 信息在用户自己电脑中,用风险略小JWT(JSONWEBTOKEN)原理BearerToken包含三个组成部分:令牌头、payload、哈希第三个参数base64可逆签名:默认使用4a6算法对令牌头、验证:默认使用hs256算法对hs256算法对令牌中数据签名并将结果和令牌中哈希////constjsonwebtoken=constconstsecret=' constopt={key:'user'}constuser{username:'abc',password:}consttokenjsonwebtoken.sign({data:tokenexp:Math.floor(Date.now()/1000)+(60*},console.log('生成token:'+//生成 :',jsonwebtoken.verify(token,secret,:{data:{username:'abc',password:'111111',}HMACHMC(HashMessageAuthenticationCode,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即C,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。按照RFC2045的定义,Base64被定义为:se64内容传送编码被设计用来把任意序列的8一种不易直接识别的形式。(heBase64ContentansrEncoingisdignoetarbitayquencesofoctsinaormthatneednotbehumanlyadabl.)常见于邮件、htp加密,截取http信息,你就会发现登录操作的用户名、字段通过ASE64编码的Beare作为一种认证类型(基于 2.0),使用"Bearer"进行定阮一峰JWT解释 /blog/2018/07/jsonwebtoken-OAuth(开放概述:登入主要基于Auth.0。Auth协议为用户资源的提供了一个安全的、开放而又简易的标准。与以往的方式不同之处是AUTH的不会使第触及到用户的帐号信息(如用户名与),即第无需使用用户的用户名与就可以申请获得该用户资源的,因此AUTH是安全的。案例:OAuth登录页面<script<script<div<a/login'>loginpathpath+=_id='+//转发 服务 /callback',async(ctx){console.log('callback..')constparams={_id: _secret:config. code:code}letres=constaccess_token=resres=awaitaxios.get('httpconsole

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论