如何在节点。js Koa2中使用JWT进行鉴权

  介绍

本篇文章为大家展示了如何在节点。js Koa2中使用JWT进行鉴权,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强>前言

在前后端分离的开发中,通过Restful API进行数据交互时,如果没有对API进行保护,那么别人就可以很容易地获取并调用这些API进行操作。那么服务器端要如何进行鉴权呢?

Json Web标记简称为JWT,它定义了一种用于简洁,自包含的用于通信双方之间以Json对象的形式安全传递信息的方法.JWT可以使用HMAC算法或者是RSA的公钥密钥对进行签名。

说得好像跟真的一样,那么到底要怎么进行认证呢?

如何在节点。js Koa2中使用JWT进行鉴权

首先用户登录时,输入用户名和密码后请求服务器登录接口,服务器验证用户名密码正确后,生成令牌并返回给前端,前端存储的令牌,并在后面的请求中把令牌带在请求头中传给服务器,服务器验证令牌有效,返回正确数据。

既然服务器端使用Koa2框架进行开发,除了要使用到jsonwebtoken库之外,还要使用一个koa-jwt中间件,该中间件针对高雅对jsonwebtoken进行了封装,使用起来更加方便。下面就来看看是如何使用的。

<强>生成标记

这里注册了个/登录的路由,用于用户登录时获取令牌。

const  router =,要求(& # 39;koa-router& # 39;) ();   const  jwt =,要求(& # 39;jsonwebtoken& # 39;);   const  userModel =,要求(& # 39;. ./模型/userModel.js& # 39;);      router.post(& # 39;/登录# 39;,,async  (ctx),=祝辞,{   const 才能;data =, ctx.request.body;   如果才能(! data.name  | |, ! data.password) {   ,,,return  ctx.body =, {   ,,,,,代码:,& # 39;000002 & # 39;   ,,,,,数据:,空,   ,,,,,味精:,& # 39;参数不合法& # 39;   ,,,}   ,,}   const 才能;result =, await  userModel.findOne ({   ,,,的名字:,data.name,   ,,,密码:data.password   })才能   如果才能(result  !==, null) {   ,,,const  token =, jwt.sign ({   ,,,,,名字:,result.name,   ,,,,,_id: result._id   ,,,},,& # 39;my_token& # 39;,, {, expiresIn: & # 39; 2 h # 39;,});   ,,,return  ctx.body =, {   ,,,,,代码:,& # 39;000001 & # 39;   ,,,,,数据:,令牌,   ,,,,,味精:,& # 39;登录成功& # 39;   ,,,}   }{其他才能   ,,,return  ctx.body =, {   ,,,,,代码:,& # 39;000002 & # 39;   ,,,,,数据:,空,   ,,,,,味精:,& # 39;用户名或密码错误& # 39;   ,,,}   ,,}   });      时间=module.exports 路由器;

在验证了用户名密码正确之后,调用jsonwebtoken的标志()方法来生成令牌,接收三个参数,第一个是载荷,用于编码后存储在令牌中的数据,也是验证令牌后可以拿到的数据;第二个是密钥,自己定义的,验证的时候也是要相同的密钥才能解码;第三个是选项,可以设置令牌的过期时间。

<强>获取令牌

接下来就是前端获取令牌,这里是在vue。js中使用axios进行请求,请求成功之后拿到令牌保存到本地文件中。这里登录成功后,还把当前时间存了起来,除了判断令牌是否存在之外,还可以再简单的判断一下当前令牌是否过期,如果过期,则跳登录页面

submit () {   axios.post才能(& # 39;/登录# 39;,,{   ,,,的名字:,this.username,   ,,,密码:this.password   }),然后才能(res =祝辞,{   ,,,如果(res.code ===, & # 39; 000001 & # 39;) {   ,,,,,localStorage.setItem(& # 39;标记# 39;,,res.data);   ,,,,,localStorage.setItem (& # 39; token_exp& # 39;,, new 日期().getTime ());   ,,,,,,美元router.push (& # 39;/& # 39;);   还有,,,}{   ,,,,,警报(res.msg);   ,,,}   })才能   }

然后请求服务器端API的时候,把令牌带在请求头中传给服务器进行验证。每次请求都要获取localStorage中的令牌,这样很麻烦,这里使用了axios的请求拦截器,对每次请求都进行了取令牌放到标题中的操作。

axios.interceptors.request.use (config =祝辞,{   const 才能;token =, localStorage.getItem(& # 39;标记# 39;);   config.headers.common才能[& # 39;授权# 39;],=,& # 39;Bearer  & # 39;, +,令牌;   return 才能;配置;   })

<>强验证标记

通过koa-jwt中间件来进行验证,用法也非常简单

const  koa =,要求(& # 39;洋槐# 39;);   const  koajwt =,要求(& # 39;koa-jwt& # 39;);   const  app =, new 高雅();//,错误处理   app.use ((ctx,,下一个),=祝辞,{   return 然后才能().catch((错),=祝辞,{   ,,,如果(err.status ===, 401) {   ,,,,,ctx.status =, 401;   ,,,,,ctx.body =, & # 39; Protected 资源,,use  Authorization  header 用get 访问\ n # 39;;   还有,,,}{   ,,,,,throw 犯错;   ,,,}   })才能   })      app.use (koajwt ({   ,,秘密:& # 39;my_token& # 39;   })。如果({   ,,路径:[/\/user \/登录/]   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

如何在节点。js Koa2中使用JWT进行鉴权