详解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 hashtable实现代码
Oct 13 Javascript
javascript Array对象基础知识小结
Nov 16 Javascript
javascript中的缓动效果实现程序
Dec 29 Javascript
javascript 3d 逐侦产品展示(核心精简)
Mar 26 Javascript
js中的for如何实现foreach中的遍历
May 31 Javascript
jQuery 3.0中存在问题及解决办法
Jul 15 Javascript
javascript比较语义化版本号的实现代码
Sep 09 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
Dec 13 Javascript
ES6新特性之字符串的扩展实例分析
Apr 01 Javascript
微信小程序scroll-view组件实现滚动动画
Jan 31 Javascript
Vue中的验证登录状态的实现方法
Mar 09 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
Sep 08 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
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
基于php上传图片重命名的6种解决方法的详细介绍
2013/04/28 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
PHP检查URL包含特定字符串实例方法
2019/02/11 PHP
网页javascript精华代码集
2007/01/24 Javascript
关于JavaScript中var声明变量作用域的推断
2010/12/16 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
jquery实现具有嵌套功能的选项卡
2016/02/12 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
vue-router:嵌套路由的使用方法
2017/02/21 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
中国好声音华少广告词
2014/03/17 职场文书
大学社团计划书
2014/05/01 职场文书
应届毕业生自荐书
2014/06/18 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
毕业酒会致辞
2015/07/29 职场文书