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之事件绑定
Jul 08 Javascript
JavaScript获取当前页面上的指定对象示例代码
Feb 28 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
Mar 30 Javascript
使用JavaScriptCore实现OC和JS交互详解
Mar 28 Javascript
Angular 4.x中表单Reactive Forms详解
Apr 25 Javascript
Javascript es7中比较实用的两个方法示例
Jul 21 Javascript
echarts学习笔记之图表自适应问题详解
Nov 22 Javascript
Javascript中parseInt的正确使用方式
Oct 17 Javascript
js实现百度淘宝搜索功能
Feb 17 Javascript
vue用elementui写form表单时,在label里添加空格操作
Aug 13 Javascript
vue router返回到指定的路由的场景分析
Nov 10 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
Dec 14 Vue.js
详解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
一个目录遍历函数
2006/10/09 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
限制文本框输入N个字符的js代码
2010/05/13 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
了解jQuery技巧来提高你的代码(个人觉得那个jquery的手册很不错)
2012/02/10 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
JS简单操作select和dropdownlist实例
2014/11/26 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
Django返回HTML文件的实现方法
2020/09/17 Python
python中PyQuery库用法分享
2021/01/15 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
法人委托书
2014/07/31 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
群众路线自我剖析及整改措施
2014/11/04 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
Java线程的6种状态与生命周期
2022/05/11 Java/Android