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中,配置secretconfig.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值
- 要在header中带上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是否过期。
-