详解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广告实现代码
Nov 17 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
May 25 Javascript
jQuery实现自动输入email、时间和域名的方法
Aug 24 Javascript
实例解析jQuery中如何取消后续执行内容
Dec 01 Javascript
简单实现bootstrap选项卡效果
Feb 08 Javascript
js实现九宫格拼图小游戏
Feb 13 Javascript
详解如何在Vue2中实现组件props双向绑定
Mar 29 Javascript
vue.js中Vue-router 2.0基础实践教程
May 08 Javascript
ES6学习之变量的两种命名方法示例
Jul 18 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
Jul 31 Javascript
iconfont的三种使用方式详解
Aug 05 Javascript
小程序Request的另类用法详解
Aug 09 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强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
2017/05/02 PHP
PHP PDOStatement::fetchObject讲解
2019/02/01 PHP
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
js返回顶部实例分享
2016/12/21 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
python简易实现任意位数的水仙花实例
2018/11/13 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
Python接口测试get请求过程详解
2020/02/28 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
英国领先的电子、技术和办公用品购物网站:Ebuyer
2018/04/04 全球购物
中东奢侈品市场:Coveti
2019/05/12 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
车工岗位职责
2013/11/26 职场文书
高中自我鉴定
2013/12/20 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
法制教育主题班会
2015/08/13 职场文书
2019假期福利管理制度!
2019/07/15 职场文书
利用python进行数据加载
2021/06/20 Python
Windows Server 2008配置防火墙策略详解
2022/06/28 Servers