Koa

131 阅读4分钟

Node Web框架(官方介绍:node.js的下一代web框架)

koa的核心代码只有1600+行,是一个更加轻量级的框架,我们可以根据需要安装和使用中间件

koa通过创建的app对象,注册中间件只能通过use方法:

koa并没有提供methods的方式

koa当中路由的基本使用

由于koa是一个轻量库 所以想要写接口的话 需要引入router路由的方式,创建一个路由的文件夹 写入对应的接口(prefix指路由的前缀)

koa部署静态资源

通过库koa-static进行部署

Koa错误处理方式

koa的响应内容

里面的ctx(上下文内容)的ctx.response.body和ctx.body是相同的,在开发当中常用ctx.body 在源码中可以了解到ctx.body是进行的代理的

koa文件上传

需要借助同express相同的multer的库 不过koa里面是特定的koa-multer

koa的参数解析

koa相对于urlencoded和form-data的情况 会引入一个库bodyParser对数据进行处理

登录凭证

(1)cookie和session

(2)Token令牌

cookie

类型为小型文本文件,某些网站为了辨识用户身份而存储在用户本地终端上的数据

浏览器会在特定的情况下携带上cookie来发送请求,我们可以通过cookie来获取一些信息

cookie总是保存在客户端上,cookie可以分为内存cookie和硬盘cookie

内存cookie由浏览器维护,保存在内存中,浏览器关闭时cookie就会消失,其存在时间是短暂的

影片cookie保存在硬盘中,有一个过期时间,用户手动清理或过期时间到时,才会被清理

cookie的生命周期

默认情况下cookie是内存cookie,在浏览器关闭时会自动被删除

expires:设置的是Date.toUTCString(),设置格式是:expires = date-in=GMTString-format

max-age:设置过期的秒钟,max-age=max-age-in-seconds(例如一年为606024*365 )

cookie的作用域(允许cookie发送给哪些URL)

Domain:指定哪些主机可以接受cookie

如果不指定,那么默认是origin,不包括子域名

如果指定Domain,则包含子域名,例如,如果设置Domain= mozilla.org,则Cookie也包含在子域名中(如developer.mozila.org)

Path:指定主机下哪些路径可以接受cookie

例如设置path=/docs,则以下地址都会被匹配

Token

cookie和session的方式有很多的缺点:

(1)cookie会被附件在每个http请求中,所以无形中增加了流量(事实上某些请求是不需要的)

(2)cookie是明文传递的,所以存在安全性的问题

(3)cookie的大小限制是4kb,对于复杂的需求来说是不够的

(4)对于浏览器外的其他客户端(ios,Android),必须手动的设置COOKIE和SESSion

(5)对于分布式系统和服务器集群中如何保证其他系统也可以正确的解析session?

token可以翻译为令牌

也就是在验证了用户账号和密码正确的情况下,给用户颁发一个令牌,这个令牌作为后续用户访问一些接口或者资源的凭证,可以根据这个凭证来判断用户是否有权限来访问

JWT实现Token机制

header: alg:采用的加密算法,默认情况下是HS256(对称加密),采用同一个密钥进行加密和解密

type:JWT,固定值,通常写成JWT即可

会进行base64Url算法进行编码

payload:

携带的数据,比如我们可以将用户的id和name放到payload中,默认也会携带iat(issued at),令牌的签发时间,我们可以设置过期时间:exp(expiration time),会通过base64Url算法进行编码

signature:

设置一个secretKey,通过将前两个的结果合并后进行HS256的算法加密:

HMACSHA256(base64Url(header)+.+base64Url(payload),serectKey)

但是如果secretKey暴露是一件非常危险的事情,因为之后就可以模拟办法token,也可以解密token

非对称加密(RS256)

私钥:用于发布令牌;

公钥:用于验证令牌;

利用 git bash的openssl生成私钥,然后再使用JWT的API进行非对称加密

补充知识点:

有时间fs.readFileSync读取相对路径文件读取不到是因为

在项目中的任何一个地方的相对路径,都是相对于process.cwd(在哪个项目文件夹启动,cwd就是哪个)