每年培训输出1000+合格IT工程师
培训影响全国各大知名IT企业和部门

Node.js的Koa实现JWT用户

Node.js的Koa实现JWT用户

const Koa = require("koa2")

const path = require("path")

const Router = require("koa-router")

const static = require("koa-static")

const fs = require("fs")

constformidable=require('koa2-formidable');

const jwt = require('jsonwebtoken'); // 用于签发、解析`token`

const jwtKoa = require('koa-jwt'); // 用于路由权限控制

const koaBody = require('koa-body'); // 用于查询字符串解析到`ctx.request.query`

const app = new Koa();

const website = {

scheme:'http',

host:'localhost',

port:1337,

join:function () {

return`${this.scheme}://${this.host}:${this.port}`

}

}

/* jwt密钥 */

const secret = 'secret';

/* 当token验证异常时候的处理,如token过期、token错误 */

app.use((ctx, next) => {

returnnext().catch((err) =>{

if(err.status===401){

ctx.status=401;

ctx.body={

ok:false,

msg:err.originalError ?err.originalError.message :err.message

}

}else{

throwerr;

}

});

});

/* 查询字符串解析到`ctx.request.query` */

app.use(koaBody());

/* 路由权限控制 */

app.use(jwtKoa({ secret: secret }).unless({

// 设置login、register接口,可以不需要认证访问

path:[

/^\/api\/login/,

/^\/api\/register/,

/^((?!\/api).)*$/// 设置除了私有接口外的其它资源,可以不需要认证访问

]

}));

function getToken(payload = {}) {

returnjwt.sign(payload,secret,{expiresIn:'4h'});

}

/* 通过token获取JWT的payload部分 */

function getJWTPayload(token) {

// 验证并解析JWT

returnjwt.verify(token.split(' ')[1],secret);

}

//处理上传图片

app.use(formidable({

uploadDir:"test",

keepExtensions :true

}));

//主路由

let router = new Router()

//api路由

let apiRouter = new Router({

prefix:'/api'//添加一个路由前缀

});

//添加静态路径

app.use(static(path.resolve(__dirname,"../")))

router.get("/",async(cxt)=>{

 

//需要添加type="html" 类型进行说明,

cxt.type='html';

cxt.response.body=fs.createReadStream(path.resolve(__dirname,"..","dist/index.html"))

})

apiRouter.get("/shop/:id",async (cxt)=>{

//获取query

console.log(cxt.request.query)

//获取参数列表

console.log(cxt.params)

cxt.body=require("./mock.json")

})

apiRouter.post("/upload",async (cxt)=>{

let {body,files} =cxt.request

console.log(files.file.path)

cxt.body=files.file.path;

})

apiRouter.get("/login",async (cxt)=>{

cxt.body={

ok:true,

msg:'注册成功',

token:getToken({ user:1, password:2})

}

})

apiRouter.get("/info",async (cxt)=>{

 

cxt.body=getJWTPayload(cxt.headers.authorization)

})

//注册路由

app.use(router.routes()).use(router.allowedMethods())

app.use(apiRouter.routes()).use(apiRouter.allowedMethods())

app.listen(3000,()=>{

console.log("server is ready on port 3000")

})
赞(0) 打赏
未经允许不得转载:徐礼文的技术博客 » Node.js的Koa实现JWT用户
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏