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 相关文章推荐
一组JS创建和操作表格的函数集合
May 07 Javascript
Jquery操作Select 简单方便 一个js插件搞定
Nov 12 Javascript
jQuery EasyUI API 中文文档 - TreeGrid 树表格使用介绍
Nov 21 Javascript
Jquery网页内滑动缓冲导航的实现代码
Apr 05 Javascript
jQuery实现html表格动态添加新行的方法
May 28 Javascript
jquery实现图片水平滚动效果代码分享
Aug 26 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
Nov 07 Javascript
php输出全部gb2312编码内的汉字方法
Mar 04 Javascript
微信小程序实现tab切换效果
Nov 21 Javascript
mui框架 页面无法滚动的解决方法(推荐)
Jan 25 Javascript
jQuery阻止事件冒泡实例分析
Jul 03 jQuery
ES6扩展运算符和rest运算符用法实例分析
May 23 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
PHP中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
js 获取屏幕各种宽高的方法(浏览器兼容)
2013/05/15 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
js禁止表单重复提交
2017/08/29 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
py2exe 编译ico图标的代码
2013/03/08 Python
python访问sqlserver示例
2014/02/10 Python
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
python 字符串只保留汉字的方法
2018/11/16 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
python中有帮助函数吗
2020/06/19 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
extern在函数声明中是什么意思
2014/01/19 面试题
成人大专生实习期的自我评价
2013/10/02 职场文书
新闻专业本科生的自我评价分享
2013/11/20 职场文书
校园自助餐厅的创业计划书
2013/12/26 职场文书
简历自我评价怎么写呢?
2014/01/06 职场文书
护理个人求职信范文
2014/01/08 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
史上最牛辞职信
2015/05/13 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
Nginx源码编译安装过程记录
2021/11/17 Servers