Node登录权限验证token验证实现的方法示例


Posted in Javascript onMay 25, 2020

1. token的使用场景

  • 无状态请求
  • 保持用户的登录状态
  • 第三方登录(token+auth2.0)

2. 基于token的验证原理

后端不再存储认证信息,而是在用户登录的时候生成一个token,然后返回给前端,前端进行存储,在需要进行验证的时候将token一并发送到后端,后端进行验证

加密的方式:对称加密和非对称加密,对称加密指的是加密解密使用同一个密钥,非对称加密使用公钥和私钥,加密用私钥加密,解密用公钥解密

3. 基于Token的身份验证的过程如下:

客户端:用户名和密码请求登录

服务器:收到请求,验证用户名和密码,验证成功后,分发一个Token返回给客户端

客户端:将Token存储,例如放在 Cookie 里或者 Local Storage 里,后续每次请求,带上此Token

服务器:收到请求,验证Token是否正确,验证成功返回请求数据

4. node + jwt(jsonwebtoken) 搭建token身份验证

安装 ActivePerl https://www.activestate.com/activeperl/downloads或本地下载地址:https://3water.com/softs/27286.html

安装 OpenSSl http://slproweb.com/products/Win32OpenSSL.html或本地下载地址: https://3water.com/softs/561776.html

在 ras 文件 终端夹下输入 openssl

生成私钥

openssl> genrsa -out ./private_key.pem 1024

生成公钥

openssl> rsa -in ./private_key.pem -pubout -out ./public_key.pem

下载包 jsonwebtoken

npm i jsonwebtoken -D         // 安装jsonwebtoken模块
const jwt = require('jsonwebtoken'); //引入包

通过私钥生成 token,发送给前端

let private_key=fs.readFileSync(path.join(__dirname,'./private_key.pem'))
var token = jwt.sign(palyload, private_key,{ algorithm: 'RS256'});

后端接收 token 验证是否有 token,没有则生成

前端把 token 存再 localStorage 或者 cookie 里

$.ajax({
   url:'http://localhost:3000/login',
   data: {
    username:username.value,
    password:password.value,
    // token:localStorage.getItem('token')
    token: cookieUtil('token')
   },
   method: "POST",
   success ( res ) {
    // const result = JSON.parse( res );
    const result = JSON.parse(res);
    console.log( result );
    if(result.auth){
     // localStorage.setItem('token', result.auth);
     cookieUtil('token', result.auth );
    }
   }
  })
 }

下次前端发送代 token 数据的请求

后端 使用公钥 token验证( token解密 )

// token验证( token解密 )
 
fs.readFile(path.join(__dirname,'../rsa/public_key.pem'),'utf8',(error,public_doc) =>{
  if( error ) throw error 
  var deencode = jwt.verify( jwt_token, public_doc )
})

完整代码

const express = require('express');

const jwt = require('jsonwebtoken');
const path = require( 'path' );
const fs = require( 'fs' );

const router = new express.Router();

router.post('/', (req, res, next) => {

 
 const { username, password,token } = req.body;

  //读取生成的私钥文件
  let private_key = fs.readFileSync(path.join(__dirname,'../rsa/private_key.pem'));
 
  if(!token) { //生成的 token 唯一的,所以第一次没有 koen 或者 token 过期是时才生成 token
    
   
   var jwt_token = jwt.sign({ username, password }, 
               private_key,
               { algorithm: 'RS256'} );
    
     // 公钥解密 前端传来的 token 
  
fs.readFile(path.join(__dirname,'../rsa/public_key.pem'),'utf8'(error,public_doc) =>{
     if( error ) throw error 
     var deencode = jwt.verify( jwt_token, public_doc )
     console.log(deencode );
    })

   res.render('login', {
    data: JSON.stringify({
     auth: jwt_token, //把生成的jwt 发给前端
     status: 1   //0 失败, 1 登录成功 2 登录重复
    })
   })
  } else { //前端发来的 token 有值,说明是第二次登录了或者token没有过期,不用再生成 token 了
    res.render('login',{
    data: JSON.stringify({
     message: '登录成功',
     status: 1 //0 失败, 1 登录成功 2 登录重复
    })
    })
  } 
})

module.exports = router;

到此这篇关于Node登录权限验证token验证实现的方法示例的文章就介绍到这了,更多相关Node登录权限验证token验证内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript中使用构造函数实现继承的代码
Aug 12 Javascript
高亮显示web页表格行的javascript代码
Nov 19 Javascript
浅谈jquery事件处理
Apr 24 Javascript
js实现新年倒计时效果
Dec 10 Javascript
jquery判断复选框选中状态以及区分attr和prop
Dec 18 Javascript
javascript实现滚动效果的数字时钟实例
Jul 21 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
Mar 30 Javascript
angular4实现tab栏切换的方法示例
Oct 21 Javascript
浅谈Vue.use到底是什么鬼
Jan 21 Javascript
JQuery省市联动效果实现过程详解
May 08 jQuery
vue移动端弹起蒙层滑动禁止底部滑动操作
Jul 22 Javascript
JavaScript字符串转数字的简单实现方法
Nov 27 Javascript
详解Node.js使用token进行认证的简单示例
May 25 #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
You might like
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
2014/06/23 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
JS中定位 position 的使用实例代码
2017/08/06 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
js实现移动端轮播图
2020/12/21 Javascript
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
python的三目运算符和not in运算符使用示例
2014/03/03 Python
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
python实现Adapter模式实例代码
2018/02/09 Python
Python3.4实现远程控制电脑开关机
2018/02/22 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
前台文员岗位职责及工作流程
2013/11/19 职场文书
求职信范文英文版
2014/01/05 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
垃圾桶标语
2014/06/24 职场文书
先进事迹演讲稿
2014/09/01 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
暂住证证明
2015/06/19 职场文书