Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

eggjs鉴权

  • 安装三个关键插件

    cnpm install -S egg-passport egg-passport-jwt jsonwebtoken
    
  • 打开config/plugin.js,找到如下内容

    module.exports = {
        //里面添加下面内容
        passport : {
            enable: true,
            package: 'egg-passport',
        },
        passportJwt:{
            enable: true,
            package: 'egg-passport-jwt',
        }
    }
    
  • config/config.default.js中,配置secret

    config.passportJwt = {
        secret: 'wouiyigeffuwjd666ffuwbfl;q;',
    };
    
  • authorize.js中写登录函数,在其中生成token返回

    async login() {
        let {username} = this.ctx.request.body;
        if(username == "xxx"){
            try{
                let token = await new Promise((resolve,reject)=>{
                    jwt.sign(
                        {username:username},
                        this.ctx.app.config.passportJwt.secret,
                        {expiresIn: 3600},
                        (err, token)=>{
                            if(err){
                                reject()
                            }
                            resolve(token)
                        }
                    )
                })
                this.ctx.state = 200;
                this.ctx.body = JSON.stringify({access_token: token})
            }catch(err){
                console.log(err);
                this.ctx.state = 401
            }
        }else{
            this.ctx.state = 401
        }
    }
    
  • routes.js中配置登录的路由,登录后会返回token值

    router.post('authorize','/api/login', controller.authorize.login)
    
  • routes.js中创建中间件,并添加到需要鉴权的api的路由中

    const jwt = app.passport.authenticate('jwt', {session:false, successReturnToOrRedirect:null})
    
    router.get('authorize','/api/vip',jwt,controller.vip.vip)
    
  • 在前端发送请求时

    • 要在header中带上token参数
      • 值为bear+空格+返回的token值

token生成原理

  • 将荷载payload,以及Header信息进行Base64加密,形成密文payload密文,header密文。

  • 将形成的密文用句号链接起来,用服务端秘钥进行HS256加密,生成签名.

  • 将前面的两个密文后面用句号链接签名形成最终的token返回给服务端

  • 注:

    • (1)用户请求时携带此token(分为三部分,header密文,payload密文,签名)到服务端,服务端解析第一部分(header密文),用Base64解密,可以知道用了什么算法进行签名,此处解析发现是HS256。

    • (2)服务端使用原来的秘钥与密文(header密文+"."+payload密文)同样进行HS256运算,然后用生成的签名与token携带的签名进行对比,若一致说明token合法,不一致说明原文被修改。

    • (3)判断是否过期,客户端通过用Base64解密第二部分(payload密文),可以知道荷载中授权时间,以及有效期。通过这个与当前时间对比发现token是否过期。