基于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机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...
随机推荐
- 【shell】数据文件分割
有时候我们必须把数据文件分割为更小的文件,这样方便我们邮件发送或者查看文件内容.split命令则可以用来分割文件. 一.根据大小来分割文件 1.一般分割 例如:现在有文件tmp.log,大小为:368 ...
- 【Linux】处理数据文件
当存在大量数据的时候,通常很难处理这些信息及提取有用信息.Linux提供了一系列的命令行工具来处理这些数据. 1.排序数据 Linux:/usr/local/sbin # cat file2 1 0. ...
- Npoi导出excel整理(附源码)
前些日子做了一个简单的winform程序,需要导出的功能,刚开始省事直接使用微软的组件,但是导出之后发现效率极其低下,绝对像web那样使用npoi组件,因此简单的进行了整理,包括直接根据DataTab ...
- jquery .live() .delegate() .bind() .click()区别
什么是.live()? 除了让你对Dom元素现在和将来绑定事件之外,.live() 方法和.bind()方法很像.你可以用.live()方法对没有存在的Dom节点绑定事件.考虑下面的情况. 当用户要离 ...
- Linux特殊的文件控制权限FACL
对文件设置特殊的权限,FACL(File Access Control List) ACL简介 基本ACL操作 getfacl 查看文件权限 setfacl 设定acl权限 设置file ...
- 共享内存:mmap函数实现
内存映射的应用: 以页面为单位,将一个普通文件映射到内存中,通常在须要对文件进行频繁读写时使用,这样用内存读写代替I/O读写,以获得较高的性能; 将特殊文件进行匿名内存映射,能够为关联进程提供共享内存 ...
- 使用Idea添加PYTHONPATH的一种方案
工作中我们常常需要更改PYTHONPATH,为项目添加一些依赖. 而不同的项目依赖的PYTHONPATH是不一样的,这就导致项目之间的PYTHONPATH发生混乱. 另一方面,有的电脑上PYTHON2 ...
- atime,mtime,ctime 的理解
Linux之atime,mtime,ctime from:http://blog.sina.com.cn/s/blog_5980699f0100zkgz.html 首先可以使用stat 命令来查询文件 ...
- 安装好php后找不到php.ini
很多同学在安装完php后找不到php.ini而烦恼. 通常php.ini的位置在: /etc目录下或/usr/local/lib目录下. 如果你还是找不到php.ini或者找到了php.ini修改后不 ...
- saltstack 基础入门文档
saltstack 和 Puppet Chef 一样可以让你同时在多台服务器上执行命令也包括安装和配置软件.Salt 有两个主要的功能:配置管理和远程执行.这里讲述了saltstack的基本使用方法. ...