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 混合的构造函数和原型方式,动态原型方式
Dec 07 Javascript
jquery选择器使用详解
Apr 08 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
Mar 01 Javascript
JavaScript操作DOM元素的childNodes和children区别
Apr 01 Javascript
jQuery垂直多级导航菜单代码分享
Aug 18 Javascript
浅谈javascript函数式编程
Sep 06 Javascript
分享12个非常实用的JavaScript小技巧
May 11 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
Sep 04 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
Sep 05 Javascript
遍历json 对象的属性并且动态添加属性的实现
Dec 02 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
Mar 07 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
Aug 22 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数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
php实现用户登陆简单实例
2017/04/04 PHP
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
JQuery之拖拽插件实现代码
2011/04/14 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
2013/11/21 Javascript
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
JavaScript基于ajax编辑信息用法实例
2015/07/15 Javascript
Vue resource中的GET与POST请求的实例代码
2017/07/21 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
2019/07/10 jQuery
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
[05:31]DOTA2上海特级锦标赛主赛事第三日RECAP
2016/03/05 DOTA
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
python插入数据到列表的方法
2015/04/30 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
python 默认参数相关知识详解
2019/09/18 Python
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
群众路线专项整治方案
2014/10/27 职场文书
办公室规章制度范本
2015/08/04 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang
Python 数据可视化之Seaborn详解
2021/11/02 Python