koa基本使用
const Koa = require('koa');
// 安装koa-router 库
// const Router = require('koa-router')
const userRouter = require('./router/user')
const app = new Koa();
app.use(userRouter.routes())
// method not allow 返回不同的请求错误提示,用来判断某一个method是公否支持
app.use(userRouter.allowedMethods())
// not found 如果所有的中间件执行完没有返回结果,就会返回这个notfound
app.use((context, dispatch) => {
// body 可以试对象字符串,buffer, 数组
context.response.body = "hell10"
})
app.use((ctx, dispatch) => {
if (ctx.request.url === '/login') {
if (ctx.request.method === 'GET') {
ctx.response.body = '登陆成功'
}
}
})
app.listen(8000, () => {
console.log('服务器启动成功')
})
cookie 使用
const Koa = require('koa')
const Router = require('koa-router')
const app = new Koa();
const testRouter = new Router();
testRouter.get('/test', (ctx, next) => {
// 设置cookie maxAge 单位是毫秒
ctx.cookies.set('name', 'lili', {
maxAge: 5 * 1000,
})
// 获取cookie
const value = ctx.cookies.get('name')
ctx.body = value
})
testRouter.get('/s', (ctx, next) => {
// 获取cookie 自动携带
const value = ctx.cookies.get('name')
ctx.body = value
})
app.use(testRouter.routes())
app.use(testRouter.allowedMethods())
app.listen(3000, () => {
console.log('服务启动成功')
})
session使用
要利用session 需要安装一个库,koa-session
const Koa = require('koa')
const Router = require('koa-router')
const Session = require('koa-session');
const app = new Koa();
const testRouter = new Router();
// 创建session
const session = Session({
key: 'sessionID',
maxAge: 10 * 1000,
// 签名,防止客户端修改或者伪造, false 则代表不需要签名
// signed: false,
signed: true,
}, app);
// 加盐
app.keys = ["aa"];
app.use(session)
testRouter.get('/test', (ctx, next) => {
// 假设用户id 和name
const id = '10'
const name = 'jiusi'
// 设置session
ctx.session.users= {id, name};
ctx.body = value
})
testRouter.get('/s', (ctx, next) => {
console.log(ctx.session)
console.log(ctx.session.users)
ctx.body = ctx.session.users
})
app.use(testRouter.routes())
app.use(testRouter.allowedMethods())
app.listen(3000, () => {
console.log('服务启动成功')
})
为什么jwt代替cookie session
- cookie 会被附加到每一个http里面,增加流量,有的请求不需要
- cookie 是明文传递,存在安全
- 大小是 4kb
- 在浏览器外的其他客户端,ios Android 中需要手动设置cookie和session,放到每一个请求的header中
- 对于分布式系统和服务器集群中 如何保证其他系统也可以正确解析session(很麻烦需要手动解析)
JWT使用
在node中利用jsonwebtoken这一个库,来实现token的鉴权,首先安装导入,在这里有两种加密的方式,第一种是对称加密,还有一种非对称加密,对称加密是服务端保存一个加密的key,利用这个key进行加密和解密,但由于加密和解密的key都一样,知道key值的人不仅可以解析token也可以颁发token,安全性非常低
所以在项目中一般我们常使用非对称加密,利用公钥和私钥的方式,利用私钥颁发token,利用公钥解密token,这样只需要保护好私钥就好,例如登录模块利用私钥颁发token,其他详情模块只有公钥解析,并不能生成,大大提高了安全性
这里还有一篇文章 www.zhihu.com/question/30… 关于jwt的方式
对称加密方式
const Koa = require('koa')
const Router = require('koa-router')
const bodyParser = require('koa-bodyparser')
const JWT = require('jsonwebtoken')
const app = new Koa();
const UserRouter = new Router();
app.use(bodyParser())
// 密钥 对称加密
const PUBLIC_KEY = '123abc'
UserRouter.post('/login', (ctx, next) => {
// 颁发token
const user = ctx.request.body;
const token = JWT.sign(user,PUBLIC_KEY, {
algorithm: 'HS256',
expiresIn: '2 days'
})
// 获取get参数
// console.log(ctx.query)
ctx.body = token
})
UserRouter.post('/token', (ctx, next) => {
const authorization = ctx.headers.authorization
console.log(authorization, 'toklen')
const getToken = authorization.replace('Bearer ', '')
// 验证当前token是否是正确的token
try {
const result = JWT.verify(getToken, PUBLIC_KEY)
ctx.body = result
} catch (error) {
ctx.body = 'token 无效'
}
})
app.use(UserRouter.routes())
app.use(UserRouter.allowedMethods())
app.listen(3000, () => {
console.log('服务启动成功')
} )
非对称加密
利用公钥私钥的方式,所以,我们要先生成 要使用的 公钥和私钥
在keys文件夹下生成公钥私钥
openssl
genrsa -out private.key 1024 // 私钥
rsa -in private.key -pubout -out public.key // 公钥
// 采用非对称加密
const fs = require('fs')
const Koa = require('koa')
const Router = require('koa-router')
const bodyParser = require('koa-bodyparser')
const JWT = require('jsonwebtoken')
const app = new Koa();
const UserRouter = new Router();
app.use(bodyParser())
// 引入密钥 对称加密
const PRIVATE_KEY = fs.readFileSync('./keys/private.key')
const PUBLIC_KEY = fs.readFileSync('./keys/public.key')
UserRouter.post('/login', (ctx, next) => {
// 颁发token
const user = ctx.request.body;
const token = JWT.sign(user,PRIVATE_KEY, {
algorithm: 'RS256',
expiresIn: '2 days'
})
// 获取get参数
// console.log(ctx.query)
ctx.body = token
})
UserRouter.post('/token', (ctx, next) => {
const authorization = ctx.headers.authorization
const getToken = authorization.replace('Bearer ', '')
// 验证当前token是否是正确的token
try {
const result = JWT.verify(getToken, PUBLIC_KEY, {
algorithms: ['RS256'],
})
ctx.body = result
} catch (error) {
ctx.body = 'token 无效'
}
})
app.use(UserRouter.routes())
app.use(UserRouter.allowedMethods())
app.listen(3000, () => {
console.log('服务启动成功')
} )