详解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 相关文章推荐
Javascript常用运算符(Operators)-javascript基础教程
Dec 14 Javascript
最佳JS代码编写的14条技巧
Jan 09 Javascript
鼠标滑上去后图片放大浮出效果的js代码
May 28 Javascript
javascript DIV实现跟随鼠标移动
Mar 19 Javascript
js简单实现调整网页字体大小的方法
Jul 23 Javascript
AngularJS ng-style中使用filter
Sep 21 Javascript
微信小程序之ES6与事项助手的功能实现
Nov 30 Javascript
AngularJS入门示例之Hello World详解
Jan 04 Javascript
JS解决移动web开发手机输入框弹出的问题
Mar 31 Javascript
vue中实现滚动加载更多的示例
Nov 08 Javascript
Vue之封装公用变量以及实现方式
Jul 31 Javascript
微信小程序canvas实现签名功能
Jan 19 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
PHP学习笔记之二
2011/01/17 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
php操作access数据库的方法详解
2017/02/22 PHP
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
JQuery触发事件例如click
2013/09/11 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
2015/12/26 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
基于打包工具Webpack进行项目开发实例
2018/05/29 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
python zip文件 压缩
2008/12/24 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
Django的models中on_delete参数详解
2019/07/16 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
golang/python实现归并排序实例代码
2020/08/30 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
专业求职信撰写要诀
2014/02/18 职场文书
学习经验交流会主持词
2014/04/01 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
2015年审计人员工作总结
2015/05/26 职场文书