详解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 相关文章推荐
用Greasemonkey 脚本收藏网站会员信息到本地
Oct 26 Javascript
文本框的字数限制功能jquery插件
Nov 24 Javascript
jQuery 学习第五课 Ajax 使用说明
May 17 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
Oct 27 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
Aug 05 Javascript
为指定的元素添加遮罩层的示例代码
Jan 15 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
JavaScript给url网址进行encode编码的方法
Mar 18 Javascript
深入解析JavaScript编程中的this关键字使用
Nov 09 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
Jan 22 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
Feb 02 Javascript
浅谈jQuery before和insertBefore的区别
Dec 04 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+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
php mssql 时间格式问题
2009/01/13 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
php解决约瑟夫环示例
2014/04/09 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
图片Slider 带左右按钮的js示例
2013/08/30 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
ReactNative中使用Redux架构总结
2017/12/15 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
python微信好友数据分析详解
2018/11/19 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
Python Django的安装配置教程图文详解
2019/07/17 Python
Python如何发送与接收大型数组
2020/08/07 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
党员个人年度总结
2015/02/14 职场文书
《学会看病》教学反思
2016/02/17 职场文书
ORACLE查看当前账号的相关信息
2021/06/18 Oracle