详解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 相关文章推荐
不提示直接关闭网页窗口的JS示例代码
Dec 17 Javascript
JS动态增加删除UL节点LI及相关内容示例
May 21 Javascript
JS实现动态给图片添加边框的方法
Apr 01 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
Jul 27 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
Sep 14 Javascript
javascript垃圾收集机制的原理分析
Dec 08 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
Jan 13 Javascript
详解性能更优越的小程序图片懒加载方式
Jul 18 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
Sep 19 Javascript
javascript跳转与返回和刷新页面的实例代码
Nov 20 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
Aug 13 Javascript
pnpm对npm及yarn降维打击详解
Aug 05 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作的文本留言本的例子(三)
2006/10/09 PHP
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
twig里使用js变量的方法
2016/02/05 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
2016/12/02 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
2017/05/11 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
webpack优化之代码分割与公共代码提取详解
2019/11/22 Javascript
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
Python unittest单元测试框架总结
2018/09/08 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
基于PyTorch中view的用法说明
2021/03/03 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
纯css3制作网站后台管理面板
2014/12/30 HTML / CSS
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
构建高效课堂实施方案
2014/03/13 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
个人委托书如何写
2014/09/25 职场文书
2014年党员整改措施
2014/10/24 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android