基于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机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...
随机推荐
- svn 命令行下常用的几个命令
1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domai ...
- [Dubbo实战]dubbo + zookeeper + spring 实战 (转)
这里最熟悉的就是spring了,项目中应用很多.dubbo是一个实现分布式的框架,zookeeper是注册中心.给我的感觉就像多对多关系的两者表,zookeeper相当于第三张表维护关系.下面通过一个 ...
- 网站流量分析指标-PV/UV/PR/ip分析及区别
1.什么是pv? PV(page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标. 高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你 ...
- RHEL7 在不同的环境中使用不同的网络配置文件
比如,我们可以设置RHEL7 系统在公司时使用一个网卡配置文件:在家时则使用另外一个配置文件(可以根据不同的环境设置多个网卡配置文件). 网卡配置信息如下: [root@rhel7 ~]# nmcli ...
- Linux指令范例速查手册
linux命令繁多,命令就是AK的子弹,对上口径,百发百中! 无意发现一本介绍Linux命令的手册--->[Linux指令范例速查手册] 下载: https://pan.baidu.com/s/ ...
- soa---java 多线程的---锁
如今soa 与分布式计算已经成为互联网公司技术的标配 那他包括的知识点应该熟悉了解.并以此为基础,去应用,调优各种soa的框架. 包括例如以下的四点.是分布式的基础. a java 多 ...
- 没有找到AdbWinApi.dll
今天调试adb命令时遇到一些问题 1. 没有找到AdbWinApi.dll 2. adb server is out of date. killing... ADB server didn't AC ...
- 安装 directx sdk 出现 S1023 解决
造成原因: directx sdk 在安装10.0.30319 of the Visual C++ Redistributable的时候发现有一个新版本的 Microsoft Visual C++ 2 ...
- selenium的运行时异常
selenium这个库是一个伟大的库,它赋予了程序员控制浏览器的能力.但是如果不理解这个库的设计上的一些哲学,就会遇到很多问题. selenium支持多种浏览器,但是这些浏览器里面,只有firefox ...
- linux线程学习
按照书上写的,不知道为什么有问题: //已解决,参考最新的blog,哈哈 #include <stdlib.h> #include <pthread.h> #include & ...