详解Node.js使用token进行认证的简单示例


Posted in Javascript onMay 25, 2020

本文只介绍简单的应用,关于json web token的具体介绍以及原理请参考阮一峰老师的JSON Web Token 入门教程。

使用的Node框架是koa2,前端发送ajax请求使用axios

首先创建工程目录:

详解Node.js使用token进行认证的简单示例

static中存放静态资源,views存放前端模板,server.js为后端代码。

安装必要的依赖项:

"dependencies": {
  "@koa/router": "^8.0.8",
  "jsonwebtoken": "^8.5.1",
  "koa": "^2.12.0",
  "koa-bodyparser": "^4.3.0",
  "koa-ejs": "^4.3.0",
  "koa-jwt": "^4.0.0",
  "koa-static": "^5.0.0",
  "koa-views": "^6.2.2"
 }

在server.js中添加代码来创建一个简单的后端程序,由于网上有太多相关示例代码,在此不再赘述。

const koa = require('koa');
const app = new koa();
const bodyParser = require('koa-bodyparser');
const router = require('@koa/router')();
const views = require('koa-views');
const static = require('koa-static');
const path = require('path');

app.use(bodyParser());
app.use(views(__dirname + '/views', {
 map: { html: 'ejs' }
}));

app.use(static(path.join(__dirname, '/static')));

router.get('/', ctx => ctx.render('index'));

app
 .use(router.routes())
 .use(router.allowedMethods());

app.listen(8080, () => {
 console.log('server is running at port 8080');
});

const path = require('path');后添加代码:

const { sign } = require('jsonwebtoken');
const secret = 'demo';
const jwt = require('koa-jwt')({ secret });

sign方法用来生成toekn,secret为自定义的秘钥,jwt提供路有权限控制的功能,它会对需要限制的资源请求进行检查。

创建路由login:

router.post('/login', ctx => {
 const { user } = ctx.request.body;
 if (user && user.username === 'vip') {
  let { username } = user;
  const token = sign({ username }, secret, { expiresIn: '1h' });
  ctx.body = {
   message: 'GET TOKEN SUCCESS',
   status: 200,
   token
  }
 } else {
  ctx.body = {
   message: 'GET TOKEN FAILED',
   status: 500
  }
 }
});

如代码所示,当前端发送的请求体中包含一个user对象并且username为vip时将生成一个token返回给前端,这里用到了前文提到的sign方法,第一个参数是用户信息,第二个参数是自定义的key,第三个参数是个option,此处只定义了过期时间。

再创建路由info:

router.get('/info', jwt, ctx => {
 ctx.body = { message: `Welcome ${ctx.state.user.username}!`};
});

与平时看到的路由代码稍有不同,这里增加了一个jwt中间件,用来对权限进行控制,如果无法通过验证,则不会执行之后的代码。在前文生成token后,会把用户名存入ctx.state.user中,在这里可以直接获取。

这时在控制台中输入node server启动该项目

打开index.html文件,添加一个简单的表单和一个按钮,并引入axios:

<form>
 <input type="text" name="username">
 <button id="submit">提交</button>
</form>
<button id="get">获取</button>
<script src="/vendors/axios.min.js"></script>

首先添加登录的逻辑:

document.querySelector('#submit').addEventListener('click', e => {
  e.preventDefault();
  const username = document.querySelector('input[name="username"]').value;
  axios.post('/login', { user: { username } })
   .then(response => {
    response = response.data;
    const { status, token, message } = response;
    if (status === 200) {
     localStorage.setItem('token', token);
    }
    alert(message);
   })
   .catch(error => alert(error.toString()));
 });

这里将服务端生成的token存入localStorage以便下次使用。

当在输入框中输入vip并点击提交按钮,后端返回如下格式的信息:

message: "GET TOKEN SUCCESS"
status: 200
token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InZpcCIsImlhdCI6MTU5MDMyOTkxOSwiZXhwIjoxNTkwMzMzNTE5fQ.PsyLYmr-pDxxdtrBEvMccVtBr9-xtOAHdZKen4FP34c"

然后再添加获取逻辑:

document.querySelector('#get').addEventListener('click', e => {
  e.preventDefault();
  const instance = axios.create({ headers: { authorization: `Bearer ${localStorage.getItem('token')}` } });
  instance.get('/info')
   .then(response => {
    response = response.data;
    console.log(response)
    alert(response.message);
   })
   .catch(error => alert(error.toString()));
 });

此处用到了axios.create方法,该方法可以在请求头中添加token信息。用localStorage中获取token并拼成形如authorization: Bearer token的形式,然后再用示例发送get请求。

此时再点击获取按钮,会提示:

详解Node.js使用token进行认证的简单示例

证明token是有效的。

此时去Application中把localStorage记录清除掉,再点击获取按钮,提示:

详解Node.js使用token进行认证的简单示例

证明拦截成功。

完整示例可以去我的GitHub查看并下载。

到此这篇关于详解Node.js使用token进行认证的简单示例的文章就介绍到这了,更多相关Node.js使用token认证内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery 中的each()跳出循环的语句
May 23 Javascript
js监听鼠标事件控制textarea输入字符串的个数
Sep 29 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
Apr 12 Javascript
Jquery和JS获取ul中li标签的实现方法
Jun 02 Javascript
Angular2中监听数据更新的方法
Aug 31 Javascript
浅析vue中的MVVM实现原理
Mar 04 Javascript
vue生命周期的探索
Apr 03 Javascript
解决layui动态加载复选框无法选中的问题
Sep 20 Javascript
vue学习笔记之作用域插槽实例分析
Feb 01 Javascript
javascript 设计模式之组合模式原理与应用详解
Apr 08 Javascript
Vue中的this.$options.data()和this.$data用法说明
Jul 26 Javascript
Vue+Java+Base64实现条码解析的示例
Sep 23 Javascript
基于redis的小程序登录实现方法流程分析
May 25 #Javascript
JSONP解决JS跨域问题的实现
May 25 #Javascript
JS实现时间校验的代码
May 25 #Javascript
使用Typescript和ES模块发布Node模块的方法
May 25 #Javascript
js 动态校验开始结束时间的实现代码
May 25 #Javascript
使用 Opentype.js 生成字体子集的实例代码详解
May 25 #Javascript
Node.js API详解之 repl模块用法实例分析
May 25 #Javascript
You might like
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
php中定时计划任务的实现原理
2013/01/08 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
javascript学习笔记(三) String 字符串类型介绍
2012/06/19 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
js表单验证实例讲解
2016/03/31 Javascript
第一次接触神奇的Bootstrap基础排版
2016/07/26 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
python解析yaml文件过程详解
2019/08/30 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
keras中模型训练class_weight,sample_weight区别说明
2020/05/23 Python
python能在浏览器能运行吗
2020/06/17 Python
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
迎新晚会邀请函
2014/02/01 职场文书
入党介绍人评语
2014/05/06 职场文书
需求分析说明书
2014/05/09 职场文书
关爱残疾人标语
2014/06/25 职场文书
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle