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 相关文章推荐
Express作者TJ告别Node.js奔向Go
Jul 14 Javascript
了不起的node.js读书笔记之node的学习总结
Dec 22 Javascript
jquery实现相册一下滑动两次的方法
Feb 09 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
Jul 01 Javascript
jquery实现的伪分页效果代码
Oct 29 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
Sep 19 Javascript
基于Vue.js实现简单搜索框
Mar 26 Javascript
JS中用try catch对代码运行的性能影响分析
Dec 26 Javascript
jQuery动态生成不规则表格(前后端)
Feb 21 Javascript
vue webpack打包后图片路径错误的完美解决方法
Dec 07 Javascript
详解React项目中碰到的IE问题
Mar 14 Javascript
Vue如何循环提取对象数组中的值
Nov 18 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
php生成固定长度纯数字编码的方法
2015/07/09 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
纯css+js写的一个简单的tab标签页带样式
2014/01/28 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
微信小程序实现点击效果
2019/06/21 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
Python抓取框架Scrapy爬虫入门:页面提取
2017/12/01 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
使用Python和xlwt向Excel文件中写入中文的实例
2018/04/21 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
python安装twisted的问题解析
2018/08/21 Python
python实现共轭梯度法
2019/07/03 Python
python读写csv文件方法详细总结
2019/07/05 Python
Java文件与类动手动脑实例详解
2019/11/10 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
数据库专业英语
2012/11/30 面试题
三维科技面试题
2013/07/27 面试题
高三生物教学反思
2014/01/25 职场文书
个人自荐材料
2014/05/23 职场文书
公证委托书格式
2014/09/13 职场文书
部队个人年终总结
2015/03/02 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫