koa2服务端使用jwt进行鉴权及路由权限分发的流程分析

  • 时间:
  • 浏览:43

大致思绪

  后端誊写REST api时,有1些api长短常敏感的,好比获得用户小我疑息,检察一切用户列表,修正稀码等。若是不合错误那些api停止庇护,那末他人就能够很简单天获得并挪用那些 api 停止操纵。

  以是对1些api,正在挪用之前,我们正在办事端必需先对操纵者停止“身份认证”,那便是所谓的鉴权。

  Json Web Token 简称为 JWT,它界说了1种通讯两边之间以 JSON 工具的情势平安通报疑息的办法。JWT 可使用 HMAC 算法或是 RSA 的公钥稀钥对停止署名,庞大度较下,换去的是更牢靠的平安系数。

  全部认证的流程大致以下:

  起首用户登录的接心是不消token认证的,由于那个接心自己便是token的发生滥觞。前端输出用户名战稀码后要求办事器登录接心,办事器考证用户名稀码准确后,死成token并前往给前端,前端存储token,并正在前面的要求中把token带正在要求头中传给办事器,办事器考证token有用,才能够停止下1步操纵。

办事器死成token

  因为我们的办事端利用 Koa2 框架停止开辟,除要利用到 jsonwebtoken 库以外,借要利用1个 koa-jwt 中心件,该中心件针对 Koa 对 jsonwebtoken 停止了启拆,利用起去愈加便利。

 const router = require('koa-router')();
const jwt = require('jsonwebtoken');
const userModel = require('../models/userModel.js');
router.post('/login', async (ctx) => {
 const data = ctx.request.body;const result = await userModel.findOne({
  name: data.name,
  password: data.password
 })
 if(result !== null){
  const token = jwt.sign({
   name: result.name,
   _id: result._id
  }, 'zhangnan', { expiresIn: '2h' });
  return ctx.body = {
   code: 200,
   token: token,
   msg: '登录胜利'
  }
 }else{
  return ctx.body = {
   code: 400,
   token: null,
   msg: '用户名或稀码毛病'
  }
 }
});
module.exports = router;

  (留意:那里临时没有会商减盐减稀校验,现实项目中稀码不成能如许明文考证,那里只是为了侧重会商token鉴权。正在考证了用户名稀码准确以后,就能够挪用 jsonwebtoken 的 sign() 办法去死成token,领受3个参数,第1个是载荷,用于编码后存储正在 token 中的数据,也是考证 token 后能够拿到的数据;第2个是稀钥,本身界说的,随意写个甚么单词皆能够,可是考证的时分1定要不异的稀钥才气解码;第3个是options,能够设置 token 的过时工夫。)

前端获得token

  接上去便是前端获得 token,那里是正在 vue.js 中利用 axios 停止要求,要求胜利以后拿到 token 保留到 localStorage 中。

submit(){
 axios.post('/login', {
  name: this.username,
  password: this.password
 }).then(res => {
  if(res.code === 200){
   localStorage.setItem('token', res.data.token);
  }else{
   this.$message('登录失利')
  }
 })
}

  然后前端正在要求后端api时,便把 token 带正在要求头中传给办事器停止考证。每次要求皆要获得 localStorage 中的 token,如许很费事,那里利用了 axios 的要求阻拦器,停止齐局设置,对每次要求皆停止了与 token 放到 headers 中的操纵。

axios.interceptors.request.use(config => {
 const token = localStorage.getItem('token');
 config.headers.common['Authorization'] = 'Bearer ' + token;
 return config;
})

(那段代码,若是是vue项目,能够间接放正在main.js中设置,暗示每次要求前城市往要求头的authorization里塞1个token,至于阿谁Bearer 是koa-jwt的1个标识单词,便利剖析)

办事器考证token

  接上去办事器支到前端收过去的token后,就能够停止考证。

const koa = require('koa');
const koajwt = require('koa-jwt');
const app = new koa();

app.use(koajwt({
 secret: 'zhangnan'
}).unless({
  path: [/\/register/, /\/login/]
}));

(正在那里出有界说毛病处置函数,因为呈现毛病后会前往401,以是我间接便让前端去处置这类非常状况,给出1个毛病的交互提醒便可)

阐发koa-jwt源码

  我们正在node_mudules内里找到koa-jwt/lib/resolvers文件夹下的auth-header.js文件,看下koa-jwt做了些甚么

  (能够看到它是先判定要求头中是不是带了 authorization,若是有,则经由过程正则将 token 从 authorization 平分离出去,那里我们也看到了Bearer那个单词。若是出有 authorization,则代表了客户端出有传 token 到办事器,这时候候便扔出 401 毛病形态。)

  再看看上1级的vertify.js。

  (能够看到正在 verify.js 中,它便是挪用 jsonwebtoken 本死供给的 verify() 办法停止考证前往成果。jsonwebtoken 的 sign() 办法用于死成 token ,而 verify() 办法固然则是用去剖析 token。属于jwt配对消费的两个办法,以是koa-jwt那其中间件也出做甚么事,不过便是用正则剖析要求头,挪用jwt的vertify办法考证token,正在koa-jwt文件夹的index.js中,koa-jwt借挪用koa-unless停止路由权限分收)

  以上便是json web token的大致流程。

总结

以上所述是小编给各人引见的koa2办事端利用jwt停止鉴权及路由权限分收的流程阐发,期望对各人有所帮忙,若是各人有任何疑问请给我留行,小编会实时复兴各人的。正在此也十分感激各人对剧本之家网站的撑持!
若是您以为本文对您有帮忙,欢送转载,烦请说明出处,开开!