自己编写koa中间件 及使用插件来实现用户认证与授权

一、认证

(一)自己编写中间件实现认证

1.首先先写认证的代码,就是验证用户是否登陆了,验证方法是验证请求头中的token。

这里中间件我就直接写路由的文件里了,没有单独拎出去放专门中间件文件里。

const Router = require('koa-router');
const jsonwebtoken = require('jsonwebtoken');
const router = new Router({prefix:'/user'})
const {find,findById,create,update,delete:del,login} = require('../controllers/user')
const { secret } = require('../config')//这里是当初加密时的秘钥

const auth = async (ctx,next)=>{
    const { authorization = ''} = ctx.request.header; //获取token,没有的话赋值空字符串
    const token = authorization.replace('Bearer ','');//截取掉token前面的Bearer。
    try {
        const user = jsonwebtoken.verify(token,secret);  //验证token是否正确
        ctx.state.user = user;  //一般我们自己要保存的信息都存在ctx.state中
    }catch(err){
        ctx.throw(401,err.message)   //认证失败,抛出401
    }
    await next() //继续向下执行
}

router.get('/', find)
router.post('/', create)
router.get('/:id', findById)
router.patch('/:id', auth, update)
router.delete('/:id', auth, del)
router.post('/login', login);

module.exports = router;

  此时当更新用户或者删除用户时必须要登陆,否则保401。这时完成了认证。

(二)使用插件实现认证:

安装koa-jwt。

const Router = require('koa-router');
//const jsonwebtoken = require('jsonwebtoken');
const jwt = require('koa-jwt');
const router = new Router({prefix:'/user'})
const {find,findById,create,update,delete:del,login} = require('../controllers/user')
const { secret } = require('../config')const auth = jwt({secret});

router.get('/', find)
router.post('/', create)
router.get('/:id', findById)
router.patch('/:id', auth, checkOwner, update)
router.delete('/:id', auth, checkOwner, del)
router.post('/login', login);

module.exports = router;

只需要一行代码就解决啦!

二、授权

接下来是授权,即我只能修改我自己的用户信息,不能修改别人的。

授权的代码很简单,只要验证要修改的用户是否是登陆的用户即可。

const Router = require('koa-router');
const jsonwebtoken = require('jsonwebtoken');
const router = new Router({prefix:'/user'})
const {find,findById,create,update,delete:del,login} = require('../controllers/user')
const { secret } = require('../config')

//用户认证(用户token是否正确)
const auth = async (ctx,next)=>{
    const { authorization = ''} = ctx.request.header;
    const token = authorization.replace('Bearer ','');//截取掉token前面的Bearer。
    try {
        const user = jsonwebtoken.verify(token,secret);
        ctx.state.user = user;  //一般我们自己要保存的信息都存在ctx.state中
    }catch(err){
        ctx.throw(401,err.message)   //认证失败,抛出401
    }
    await next() //继续向下执行
}

//授权,判断是不是用户自己,用户只能修改自己的信息
const checkOwner = async (ctx,next)=>{
    if(ctx.params.id != ctx.state.user._id){
        ctx.throw(403,"没有权限")
    }
    await next()
}

router.get('/', find)
router.post('/', create)
router.get('/:id', findById)
router.patch('/:id', auth, checkOwner, update)
router.delete('/:id', auth, checkOwner, del)
router.post('/login', login);

module.exports = router;

此时就大功搞成了!

注:如果你想从postman上验证用户token,方法在https://www.cnblogs.com/kaiqinzhang/p/12132702.html最后面有写。