zoukankan      html  css  js  c++  java
  • 自己编写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最后面有写。

  • 相关阅读:
    linux /proc/pid进程信息说明
    fdopen()和fileno()函数
    什么是Intent
    内容提供器
    app:showAsAction 和android:showAsAction
    android:oneshot
    Android的三种主流资源尺寸
    Android中android:visibility的3中属性的剖析
    Android中的ProgressBar的android:indeterminate
    uses-permission和permission详解
  • 原文地址:https://www.cnblogs.com/kaiqinzhang/p/12146005.html
Copyright © 2011-2022 走看看