koa

289 阅读3分钟

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

  1. cookie 会被附加到每一个http里面,增加流量,有的请求不需要
  2. cookie 是明文传递,存在安全
  3. 大小是 4kb
  4. 在浏览器外的其他客户端,ios Android 中需要手动设置cookie和session,放到每一个请求的header中
  5. 对于分布式系统和服务器集群中 如何保证其他系统也可以正确解析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('服务启动成功')
} )