一、登陆的验证流程

  当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端

二、基于token的身份验证方法

  1、用户向服务器发送用户名和密码。

   2、服务端收到请求,去验证用户名与密码

  3、验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端。

  4、客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里

  5、用户随后的每一次请求,都会通过 Cookie,将 token 传回服务器。

  6、服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

三、jsonwebtoken

  1、jwt的原理

     服务器认证后,生成一个json对象,发送给用户,就向下面这样

{
"姓名": "alley",
"角色": "管理员",
"到期时间": "2019年3月9日0点0分"
}

  

  2、jwt的组成部分

   header:头部    payload:负载    secret:签名

  2-1、header:

  header是一个json对象,主要由2部分组成,一个是token的类型,一个是使用的算法

{
type:"jwt",
alg:"HS256"
}

  2-2、payload:

  payload也是一个json对象,用来存放实际需要传递的数据,官方规定了7个字段

iss (issuer):签发人 
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

  

  除了官方定义的7个字段外,你还可以定义其他私有字段

{
iss:"admin",
user:'alley',
}

  注意:JWT默认是不加密的,任何人都可以读到,所以不要把私密信息放入这个部分

  2-3、secret:

  secret是一个签名,防止数据篡改。这个签名只有服务器知道,不能泄露给用户。然后使用

  header中的签名算法生成签名。(算法默认是HMAC SHA256)

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

  

  

四、jwt的基本使用(基于express)

const jwt = require("jsonwebtoken");
const secret = "secret";//签名 const getCookie = (key)=>{
const cookies = req.headers.cookie;
const arr = cookies.split("; ");
for(var i=0;i<arr.length;i++){
let newArr = arr[i].split("=");
if(newArr[0] == key){
return newArr[1];
}
}
} //验证token
const verifyTokenMiddle = (req,res,next)=>{
let token = getCookie("token"); jwt.verify(token, scret, function(err, decoded) {
if(err){
return res.json({
state:false,
info:"token验证失败"
})
}
next()
});
} //创建token
const createToken = (username)=>{
const payload = {
user:username
} return jwt.sign(payload, secret,{expiresIn:'1h'});
} module.exports = {
createToken,
verifyTokenMiddle
}

【node】---token的原理及使用---【alley】的更多相关文章

  1. Django中csrf token验证原理

    我多年没维护的博客园,有一篇初学Django时的笔记,记录了关于django-csrftoekn使用笔记,当时几乎是照抄官网的使用示例,后来工作全是用的flask.博客园也没有维护.直到我的博客收到了 ...

  2. JSON WEB TOKEN 从原理到实战

    阅读本文大概需要 4.2 分钟. 作者:王廷骏原文:https://juejin.im/post/5ce272c1e51d45109b01b0f8 1. JSON WEB TOKEN 1.1 什么是J ...

  3. 初学node node开发环境搭建 node模块化 commonJS原理

    由于Node.js平台是在后端运行JavaScript代码,所以,必须首先在本机安装Node环境. 学习node,首先要装node,和它的包管理工具,这两个都是傻瓜式安装,百度一下就安装了. 安装完之 ...

  4. struts2令牌(token)内部原理

      小菜最近接触了struts2中的令牌知识,由于该知识点比较重要,因此想弄明白些,于是满怀信心的上网查阅资料,结果让小菜很无奈,网上的资料千篇一律,总结出来就一句话:“访问页面时,在页面产生一个to ...

  5. node 模块载入原理【1】

    简单介绍 我们会从简单的模块载入原理来开始,尝试阅读下 Node.js 源代码.首先我们知道 Node.js 的源代码主要是由 C++ 和 JavaScript 编写的,JS 部分主要在 lib 目录 ...

  6. node(async原理)

    node中的async是用来实现同步操作的,提供包括map.Series等方法,本文不做赘述. 由于项目需要在浏览器端用了async.js,因此仔细看了下它的代码.原来,一直以为node是在服务端调用 ...

  7. Java Token的原理和生成使用机制

    在此之前我们先了解一下什么是Cookie.Session.Token 1.什么是Cookie? cookie指的就是浏览器里面能永久存储数据的一种数据存储功能.cookie由服务器生成,发送给浏览器, ...

  8. CSRF token的原理

    参考: http://www.cnblogs.com/zhaof/p/6281482.html 简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.cs ...

  9. Token原理以及应用

    近期由于项目需要开发供第三方使用的api,在整个架构设计的一个环节中,对api访问需要进行认证,在这里我选择了token认证. 一:token的优势(此部分引自http://www.sumahe.cn ...

随机推荐

  1. 线程类中使用spring注解报空指针异常

    springboot项目开发中,作为服务端,实现了线程类,在此类中添加spring注解@Source注入的service,报空指针异常. 查原因后,发现是线程中,不支持spring注解,因为sprin ...

  2. Locally weighted regression algorithm

    之前所讨论的梯度下降算法,其算法模型是“线性回归模型”,我们可以理解为变量与因变量之间的关系是线性的.而现实情况是,使用线性模型去描述所有数据,很容易出现欠拟合(underfitting)的情况:同样 ...

  3. 【Java多线程系列七】ExecutorService

    java.util.concurrent.ExecutorService接口提供了许多线程管理的方法 Method 说明 shutdown 拒绝接收新的任务,待已提交的任务执行后关闭,且宿主线程不阻塞 ...

  4. PAT甲级——A1141 PATRankingofInstitution

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  5. Django框架(十七)—— 中间件、CSRF跨站请求伪造

    目录 中间件 一.什么是中间件 二.中间件的作用 三.中间件执行顺序 四.自定义中间件 1.导包 2.定义类,继承MiddlewareMixin 3.在视图函数中定义一个函数 4.在settings的 ...

  6. Java DOM解析器 - 查询XML文档

    这是需要我们查询的输入XML文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?xml version="1.0"?> ...

  7. awk 按小时 统计接口调用次数

    #统计所有接口总量awk -F ' ' '{a[$7]++} END{for(i in a){print i,a[i] | "sort -r -k 7"}}' accesslog/ ...

  8. Vertical-Align,你应该知道的一切

    我们聊聊vertical-align.这个属性主要目的用于将相邻的文本与元素对齐.而实际上,verticle-algin可以在不同上下文中灵活地对齐元素,以及进行细粒度的控制,不必知道元素的大小.元素 ...

  9. oracle中hint 详解

    Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行 ...

  10. pytest-skip详解

    import pytestimport sysenvironment='android' #设置系统变量为android @pytest.mark.skipif(environment==" ...