koa2开发的api服务及jwt应用

koa2开发的api服务示例,使用用jwt验证。

github代码:https://github.com/yunzaifei/koa2-jwt-demo

安装及部署

  • 执行命令npm install
  • 执行命令npm start启动服务
  • 可以通过postman等工具对服务进行测试,或者通过npm run test命令使用网页页查看

涉及知识点

  • koa2框架
  • jwt原理及应用
  • mongoose应用
  • async/await的简单使用

知识点讲解

koa2框架

koa就是一种简单好用的Web框架。它的特点是优雅、简洁、表达力强、自由度高。本身代码只有1000多行,所有功能都通过插件实现,很符合Unix哲学。

koa官网 http://koajs.com/

koa中文文档 https://github.com/guo-yu/koa-guide

koa2进阶学习笔记 https://chenshenhai.github.io/koa2-note/

本示例中涉及的中间件

中间件 功能说明 链接 备注
bcrypt 加密 NPM version 用于用户密码存入数据库时
jsonwebtoken jwt实现 NPM version
kcors koa跨域 NPM version
koa koa框架 NPM version
koa-bodyparser 数据解析到ctx.request.body中 NPM version 详细
koa-json response转换位json格式 NPM version
koa-jwt jwt自动校验 NPM version 使用后不用在每个路由下手写校验方法
koa-logger 日志 NPM version
koa-router 路由 NPM version 详细
mongoose 操作mongodb数据库 NPM version 文档

代码结构说明

本示例代码实现api服务,因为没有页面展示功能,所以没有使用koa-static加载静态资源和创建views视图结构。

启动文件是app.js。

route文件夹是路由服务。

config.js文件记录所有配置信息方便统一管理。

jwt原理及应用

jwt原理

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。注意,在JWT中,不应该在载荷里面加入任何敏感的数据。查看jwt信息:https://jwt.io/

jwt原理

基于Token的WEB后台认证机制

jwt应用

对于jwt的应用,本示例中主要用到jsonwebtokenNPM version和koa-jwtNPM version两个中间件。koa-jwt是对jsonwebtoken功能的封装,如果想更灵活的实现并且不怕麻烦,可以只使用jsonwebtoken中间件。

jsonwebtoken用法

1
2
3
4
5
6
7
8
9
10
11
12
//jsonwebtoken在服务端生成token返回给客户端
const jwt = require('jsonwebtoken')
const token = jwt.sign({
id: user._id,
secret: user.app_secret
}, config.jwt_secret, {expiresIn: 3600})

ctx.body = {
code: 200,
message: '登录成功!',
token: token
}

koa-jwt用法

1
2
3
4
5
6
7
8
9
10
11
12
//koa-jwt在服务端校验从客户端提交的token值
const app = new Koa()
const jwt = require('koa-jwt')
app.use(jwt({secret: config.jwt_secret}).unless({path:[/^\/api\/login/, /^\/api\/register/]})) //usless排除进行jwt校验的路由

//在路由中处理
const router = require('koa-router')()
router.post('/xxx', async ctx => {
const token = ctx.state.user
console.log('user_id:', token.id)
console.log('user.app_secret:', token.secret)
}

mongoose应用

mongoose文档:http://mongoosejs.com/docs/guide.html

mongoose中文文档:https://mongoose.shujuwajue.com/

async/await的简单使用

async 函数

深入理解ES7的async/await

Callback、Promise、Generator、async/await对比