一、认证
(一)自己编写中间件实现认证
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最后面有写。