详解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 相关文章推荐
Jquery带搜索框的下拉菜单
May 06 Javascript
JS中JSON对象和String之间的互转及处理技巧
Apr 06 Javascript
微信小程序 picker 组件详解及简单实例
Jan 10 Javascript
Javascript for in的缺陷总结
Feb 03 Javascript
详解Vue 开发模式下跨域问题
Jun 06 Javascript
javascript 中事件冒泡和事件捕获机制的详解
Sep 01 Javascript
js实现音乐播放控制条
Sep 09 Javascript
js array数组对象操作方法汇总
Mar 18 Javascript
angular6开发steps步骤条组件
Jul 04 Javascript
javascript实现时间日期的格式化的方法汇总
Aug 06 Javascript
JavaScript实现页面动态验证码的实现示例
Mar 23 Javascript
vue打包时去掉所有的console.log
Apr 10 Vue.js
基于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中autoload的用法总结
2013/11/08 PHP
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
2016/04/26 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
es6新特性之 class 基本用法解析
2018/05/05 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
Javascript实现打鼓效果
2021/01/29 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
Django分组聚合查询实例分享
2020/04/29 Python
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
女子职高个人自荐书
2014/02/01 职场文书
前厅部经理岗位职责范文
2014/02/04 职场文书
药店主任岗位责任制
2014/02/10 职场文书
运动会方阵解说词
2014/02/12 职场文书
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
老公爱的承诺书
2014/03/31 职场文书
《高尔基和他的儿子》教学反思
2014/04/09 职场文书
体育教师求职信
2014/06/30 职场文书
作风整顿剖析材料
2014/09/30 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
python周期任务调度工具Schedule使用详解
2021/11/23 Python
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers