Koa实战-鉴权

课程目标

@掌握Koa基本用法    @理解Koa设计思路    @路由    @静态文件服务   @模板引擎

koa 概述:koa是一个新的Web框架,致力于成为Web应用和api开发领域中的一个更小,更富有表现力,更健壮的基石

koa是express的下一代基于node.js的web框架 

koa2完全使用Promise并配合async来实现异步

特点: 轻量 无捆绑  中间件架构 优雅的api设计   增强错误处理

安装: npm i koa -S

中间件机制、请求、响应处理

输出 hellokaikeba!!!

中间件的作用是什么 ?

对于我们业务程序的描述有两种需要,一种是顺序的需要,同时也有一种非顺序描述的需要,也可以说是一种横向的业务描述的需要,比如鉴权,每次开始的时候需要处理,错误处理 每次到头部的时候 包括统一加头部,这些都可以认为是一种横向业务描述的需要,这些统称为AOP编程(面向切面编程)

koa中间件计时
服务端输出

中间件内错误捕捉和全局内错误捕捉

中间件内错误捕捉
全局

路由: npm i -S koa-router


index.js
users.js

在index.js中引入

引入router

静态文件服务: npm i -S koa-static

模板引擎: npm i koa-hbs@next -S

引入并配置,app.js

创建views,views/partials,layout.hbs,index.hbs layout.hbs:

渲染,./routes/index.js

三种常见的鉴权方式 1 session / cookie 2 token 3 oAuth

1, session / cookie 方式

创建http.createServer服务,res.setHeader('Set-Cookie','cx=abc') 设置cookie, 启动服务可以在application中看到cx abc的cookie信息 观察一下network 在我在发送localhost的3000的请求的时候,它会response headers里发 Set-Cookie:cx=abc cookie的原理是默认同域的情况下会发送cookie  Cookie: cx=abc  ,response回应的时候如果浏览器收到让你setCookie这样儿一个header的时候,它就会设置这个cookie,如果下次再走这个请求的时候,它就会自动带上这个cookie,作用就是建立一种前端的状态的保存,回传给他,这样儿如果后端想在前端放置一个状态的时候,我就可以有这样一种方法,比如说我就可以设置很多信息了,比如前端的登录态,使用这个cookie形成一种session机制。

cookie

下面我们看一下session:

说到session的话,我们怎么记录登录态或者说记录用户信息,假如每一个用户有一个唯一的标识用 const sid = (Math.random() * 9999).toFixed() , 我们设置setHeader时可以这样儿设置res.setHeader('Set-Cookie',`sid = ${sid}`)

同时我们可以在后端访问的话,我们可以整一个键值对 const session = {} 设置 session[sid] = { name: 'wang' }

session

实现原理:1,服务器在接受客户端首次访问时在服务器创建session,然后保存session(我们可以保存在session中,也可以保存在redis中,推荐使用后者),然后给这个session生成一个唯一的标识字符串,然后的响应头种下这个唯一标识字符串。

2,签名,这一步通过秘钥对sid进行签名处理,避免客户端修改sid(非必须步骤)

3,浏览器中收到请求响应的时候会解析响应头,然后将sid保存在本地的cookie中,浏览器在下次http请求的请求头中会带上该域名下的cookie信息

4,服务器在接受客户端请求时会去解析请求头cookie中的sid,然后根据这个Sid去找服务器端保存的该客户端的session,然后判断该请求是否合法。

原理

koa鉴权

引入koa

当SESS_CONFIG的signed为true时,会对签名的加密主体进行一次哈希,哈希其实就是一种摘要算法,原意是把一个不定长摘要出一个定长结果,并且它本身是一种摘要,具有雪崩效应。

摘要:是一种不可逆的算法起到一种防篡改的作用,雪崩效应:密文略有变化 ,明文就会发生巨大的变化,这种不可推算的效应。

sig签名

token验证

token原理

1.客户端使用用户名和密码请求登录

2.服务端收到请求,去验证用户名与密码

3.验证成功后,服务端会签发一个令牌(token) ,再把这个token发送给客户端

4.客户端收到token以后可以把它存储起来,比如放在cookie里或者local storage里

5.客户端每次向服务端请求资源的时候需要带着服务端签发的token

6.服务端收到请求然后去验证客户端的请深圳市里面带着的Token 如果验证成功,就向客户端返回请求的数据

OAuth(开放授权)

概念:三方登入主要基本于OAuth 2.0 OAuth协议为用户资源的授权提供了一个案例的,开放而又简易的标准,与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的账号信息,如用户名与密码,即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的

OAUTH的登录流程

OAUTH的登录流程


补充材料:

当你想用异步程序描写同步操作的时候就很麻烦了。https://github.com/su37josephxia/frontend-basic/blob/master/src/callback/index.js (参考前端大班车)

EventLoop是什么 : 事件循环被称作循环的原因在于,它一直在查找新的事件并且执行。一次循环的执行称之为 tick, 在这个循环里执行的代码称作 task,event loop顾名思义就是事件循环,为什么要有事件循环呢?因为V8是单线程的,即同一时间只能干一件事情,但是呢文件的读取,网络的IO处理是很缓慢的,并且是不确定的,如果同步等待它们响应,那么用户就起飞了。于是我们就把这个事件加入到一个 事件队列里(task),等到事件完成时,event loop再执行一个事件队列。

EventLoop

setTimeout / setImmediate / process.nextTick的区别 (https://blog.csdn.net/hkh_1012/article/details/53453138)

v8引擎单线程无法同时干两件事

文件读取 网络IO缓慢具有不确定性

要通过异步回调的方式处理又称为异步io

先同步再异步 异步放入队列等同步完成后再执行 每次循环叫一个tick(process.nextTick())

异步任务的区分

microtasks(微任务)

唯一整个事件循环当中,仅存在一个,执行为同步,同一个事件循环中的microtask按队列顺序,串行执行完毕; process.nextTick  /  promise / Object.observe  /  MutationObserver

tasks(宏任务)

setTimeout  /  setInterval  /  setImmediate  /  I/O  /  UI渲染

先执行微任务 再执行宏任务

========================================================================

Restful API 及常见任务

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容