基于express框架的Token实现方案
什么是Token?
在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般我们所说的的token大多是指用于身份验证的token
Token的特点
- 随机性
- 不可预测性
- 时效性
- 无状态、可扩展
基于Token的身份验证方法
- 客户端使用用户名和密码请求登录
- 服务端收到请求,验证登录是否成功
- 验证成功后,服务端会返回一个Token给客户端,反之,返回身份验证失败的信息
- 客户端收到Token后把Token用一种方式(cookie/localstorage/sessionstorage/其他)存储起来
- 客户端每次发起请求时都选哦将Token发给服务端
- 服务端收到请求后,验证Token的合法性,合法就返回客户端所需数据,反之,返回验证失败的信息
JWT(Json Web Tokens)
生成Token的解决方案有许多,常用的一种就是 Json Web Tokens .
JWT标准的Tokens由三部分组成
- header
- payload
- signature
中间使用 " . " 分隔开,并且都会使用Base64编码方式编码,如下
eyJhbGc6IkpXVCJ9.eyJpc3MiOiJCIsImVzg5NTU0NDUiLCJuYW1lnVlfQ.SwyHTf8AqKYMAJc
header
header 部分主要是两部分内容,一个是 Token 的类型,另一个是使用的算法,比如下面类型就是 JWT,使用的算法是 Hash256。
{
"typ": "JWT",
"alg": "HS256"
}
payload
Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段:
- iss:Issuer,发行者
- sub:Subject,主题
- aud:Audience,观众
- exp:Expiration time,过期时间
- nbf:Not before
- iat:Issued at,发行时间
- jti:JWT ID
比如下面
{
"iss": "ninghao.net",
"exp": "1438955445",
"name": "wanghao",
"admin": true
}d
signature
JWT 的最后一部分是 Signature ,这部分内容有三个部分,先是拼接 Base64 编码的 header.payload ,再用不可逆的Hamc加密算法加密,加密时使用一个密钥,这个密钥服务端保存,生成signature。
最后组合token,如下
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.
SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
客户端收到这个 Token 以后把它存储下来,下回向服务端发送请求的时候就带着这个 Token 。服务端收到这个 Token ,然后进行验证,通过以后就会返回给客户端想要的资源。
Nodejs实现
token.js
var crypto=require("crypto");
var token={
createToken:function(obj,timeout){
console.log(parseInt(timeout)||0);
var obj2={
data:obj,//payload
created:parseInt(Date.now()/1000),//token生成的时间的,单位秒
exp:parseInt(timeout)||10//token有效期
};
//payload信息
var base64Str=Buffer.from(JSON.stringify(obj2),"utf8").toString("base64");
//添加签名,防篡改
var secret="hel.h-five.com";
var hash=crypto.createHmac('sha256',secret);
hash.update(base64Str);
var signature=hash.digest('base64');
return base64Str+"."+signature;
},
decodeToken:function(token){
var decArr=token.split(".");
if(decArr.length<2){
//token不合法
return false;
}
var payload={};
//将payload json字符串 解析为对象
try{
payload=JSON.parse(Buffer.from(decArr[0],"base64").toString("utf8"));
}catch(e){
return false;
}
//检验签名
var secret="hel.h-five.com";
var hash=crypto.createHmac('sha256',secret);
hash.update(decArr[0]);
var checkSignature=hash.digest('base64');
return {
payload:payload,
signature:decArr[1],
checkSignature:checkSignature
}
},
checkToken:function(token){
var resDecode=this.decodeToken(token);
if(!resDecode){
return false;
}
//是否过期
var expState=(parseInt(Date.now()/1000)-parseInt(resDecode.payload.created))>parseInt(resDecode.payload.exp)?false:true;
if(resDecode.signature===resDecode.checkSignature&&expState){
return true;
}
return false;
}
}
module.exports=exports=token;
基于express框架的Token实现方案的更多相关文章
- 基于express框架的应用程序骨架生成器介绍
作者:zhanhailiang 日期:2014-11-09 本文将介绍怎样使用express-generator工具高速生成基于express框架的应用程序骨架: 1. 安装express-gener ...
- 【Node.js】一、搭建基于Express框架运行环境+更换HTML视图引擎
1)安装express generator生成器 这个express generator生成器类似于vue-cli脚手架工具,用来创建一个后端项目,首先我们要对生成器进行全局安装,在cmd中输入下 ...
- 基于express框架的留言板实现步骤
这个留言板是基于express框架,和ejs模板引擎,首先需要在根目录安装express框架,然后安装ejs模块和body-parser(获取用户表单提交的数据):建立项目目录 message,然后依 ...
- Node.js基于Express框架搭建一个简单的注册登录Web功能
这个小应用使用到了node.js bootstrap express 以及数据库的操作 :使用mongoose对象模型来操作 mongodb 如果没了解过的可以先去基本了解一下相关概念~ 首先注 ...
- 【Node.js】二、基于Express框架 + 连接MongoDB + 写后端接口
在上节,我们讲了如何搭建express环境,现在我们说说如何通过node.js写服务接口给前端调用 1. 首先通过MongoDB建好数据库与表格 例如,我的数据库名字为db_demo,数据库表格为go ...
- 搭建基于Express框架运行环境
安装express generator生成器 通过生成器自动创建项目 配置分析 一.安装 cnpm i -g express-generator express --version // 查看版本 e ...
- 解决前端向后端请求静态资源的问题(基于express框架)
请求js,css,image资源: 前端 <script src='后端url/assets/js/xxx.js'>,<link href='后端url/assets/css/xxx ...
- NODE 基于express 框架和mongoDB的cookie和session认证 和图片的上传和删除
源码地址 https://gitee.com/zyqwasd/mongdbSession 本项目的mongodb是本地的mongodb 开启方法可以百度一下 端口是默认的27017 页面效果 1. 注 ...
- Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室
一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...
随机推荐
- 〖Network〗宿舍配置两路由器,同时访问校园内网和校园外网
环境: 校园宿舍, 10.x.x.x 和 172.16.x.x~172.31.x.x是校园内网,本科教务系统什么的都在上边 路由器: 路由器1(校园内网):水星MR807 路由器2(拨号上网):TP ...
- Ubuntu14.04设置开机自启动脚本
方法一.编辑rc.loacl脚本 Ubuntu开机之后会执行/etc/rc.local文件中的脚本,所以我们可以直接在/etc/rc.local中添加启动脚本.在 exit 0 前面添加好脚本代码, ...
- INT函数和ROUND
语法:INT(number) Number 需要进行向下舍入取整的实数
- Oracle Tuxedo的配置文件配置详解
# (c) 2003 BEA Systems, Inc. All Rights Reserved. #ident "@(#) samples/atmi/simpapp/ubbsimple $ ...
- 【php导出pdf文件】php将html 导出成pdf文件(MPDF60),支持完美分页,注意是完美!!
1.使用 MPDF60 包 2.防止中文乱码:修改MPDF/MPDF60/config.php中 $this->autoLangToFont = true; $this->autoScri ...
- 【OT1.0 + TP3.2】开启trace调试、输出调试信息、开启自定义菜单
1.开启trace调试 A- 后台系统设置 show-page-trace = 1 B-config.php文件.配置 show-page-trace = true 2.输出调试信息 很奇怪,OT竟然 ...
- tomcat启动dubbo报IO异常
严重: Servlet [springDispatcher] in web application [/dubbo-service] threw load() exception java.io.IO ...
- 【DM】The PageRank Citation Ranking: Bringing Order to the Web - PageRank引用排名:将订单带到Web上
[论文标题]The PageRank Citation Ranking: Bringing Order to the Web (1998) [论文作者]Larry Page [论文链接]Paper(1 ...
- 【虚拟化系列】VMware vSphere 5.1 网络管理
网络是VMware vSphere 5.1的基础,所有虚拟机都需要网络来进行通信.如果将所有的虚拟机都看成是物理机,则在网络拓扑上,需要网卡和交换机等不同的网络连接设备和方式.而在虚拟化中,这些 ...
- MySQL常见错误代码及代码说明
1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败<=================可以忽略 1008:数据库不存在,删除数据库失败<======== ...