JWT是啥?

JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为:

A.B.C

A由JWT头部信息header加密得到
B由JWT用到的身份验证信息json数据加密得到
C由A和B加密得到,是校验部分

怎样生成A?

header格式为:

[csharp] view plaincopy print?
  1. {
  2. "typ": "JWT",
  3. "alg": "HS256"
  4. }
{"typ": "JWT","alg": "HS256"
}

  

它就是一个json串,两个字段是必须的,不能多也不能少。alg字段指定了生成C的算法,默认值是HS256
将header用base64加密,得到A
通常,JWT库中,可以把A部分固定写死,用户最多指定一个alg的取值

怎样计算B?

根据JWT claim set[用base64]加密得到的。claim set是一个json数据,是表明用户身份的数据,可自行指定字段很灵活,也有固定字段表示特定含义(但不一定要包含特定字段,只是推荐)。
这里偷懒,直接用php中的代码来表示claim set了,重在说明字段含义:

[csharp] view plaincopy print?
  1. $token = array(
  2. "iss" => "http://example.org",   #非必须。issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者。
  3. "iat" => 1356999524,                #非必须。issued at。 token创建时间,unix时间戳格式
  4. "exp" => "1548333419",            #非必须。expire 指定token的生命周期。unix时间戳格式
  5. "aud" => "http://example.com",   #非必须。接收该JWT的一方。
  6. "sub" => "jrocket@example.com",  #非必须。该JWT所面向的用户
  7. "nbf" => 1357000000,   # 非必须。not before。如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟。
  8. "jti" => '222we',     # 非必须。JWT ID。针对当前token的唯一标识
  9. "GivenName" => "Jonny", # 自定义字段
  10. "Surname" => "Rocket",  # 自定义字段
  11. "Email" => "jrocket@example.com", # 自定义字段
  12. "Role" => ["Manager", "Project Administrator"] # 自定义字段
  13. );
$token = array("iss" => "http://example.org",   #非必须。issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者。"iat" => 1356999524,                #非必须。issued at。 token创建时间,unix时间戳格式"exp" => "1548333419",            #非必须。expire 指定token的生命周期。unix时间戳格式"aud" => "http://example.com",   #非必须。接收该JWT的一方。"sub" => "jrocket@example.com",  #非必须。该JWT所面向的用户"nbf" => 1357000000,   # 非必须。not before。如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟。"jti" => '222we',     # 非必须。JWT ID。针对当前token的唯一标识"GivenName" => "Jonny", # 自定义字段"Surname" => "Rocket",  # 自定义字段"Email" => "jrocket@example.com", # 自定义字段"Role" => ["Manager", "Project Administrator"] # 自定义字段
);

  

JWT遵循RFC7519,里面提到claim set的json数据中,自定义字段的key是一个string,value是一个json数据。因此随意编写吧,很灵活。

个人初学,认为一个最基本最简单最常用的claim set为:

$token=array("user_id" => 123456, #用户id,表明用户"iat" => 1356999524, #token发布时间 "exp" => 1556999524, #token过期时间 );

将claim set加密后得到B,学名payload

怎样计算C?

A.B使用HS256加密(其实是用header中指定的算法),当然加密过程中还需要密钥(自行指定的一个字符串)。
加密得到C,学名signature,其实就是一个字符串。作用类似于CRC校验,保证加密没有问题。

好了,现在A.B.C就是生成的token了。

怎样使用token?

可以放到HTTP请求的请求头中,通常是Authorization字段。
也有人说放到cookie。不过移动端app用cookie似乎不方便。

token应用流程?

  1. 初次登录:用户初次登录,输入用户名密码
  2. 密码验证:服务器从数据库取出用户名和密码进行验证
  3. 生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT
  4. 返还JWT:服务器的HTTP RESPONSE中将JWT返还
  5. 带JWT的请求:以后客户端发起请求,HTTP REQUEST HEADER中的Authorizatio字段都要有值,为JWT
服务器端在处理到达的request之前,会将request中的Token值与保存在当前用户session中的令牌值进行比较,看是否匹配。在处理完该request后,且在response发送给客户端之前,将会产生一个新的 Token,该Token除传给客户端以外,也会将用户session中保存的旧的Token进行替换。这样,如果用户会退到刚才的提交页面并再次提交的话,客户端传过来的Token值和服务器端的不一致,从而有效地防止了重复提交地发生。

出处:https://blog.csdn.net/u010265681/article/details/76651765

WebApi_基于Token的身份验证——JWT相关推荐

  1. 基于Token的身份验证——JWT

    原文:基于Token的身份验证--JWT 初次了解JWT,很基础,高手勿喷. 基于Token的身份验证用来替代传统的cookie+session身份验证方法中的session. JWT是啥? JWT就 ...

  2. PHP无状态对象,(PHP)基于Token的身份验证中对无状态的理解

    假设我们设计的Token储存的信息为: 用户名.发行时间.过期时间.签名 在用户登录成功后,我们获取到用户的用户名.此时的时间戳,并将它们和我们设置的过期时间拼接在一起,组成一个字符串,假设为: $i ...

  3. 基于 Token 的身份验证:JSON Web Token

    最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等, 比起传统的身份验证方法,Token 扩展性更强 ...

  4. node实现基于token的身份验证

    最近研究了下基于token的身份验证,并将这种机制整合在个人项目中.现在很多网站的认证方式都从传统的seesion+cookie转向token校验.对比传统的校验方式,token确实有更好的扩展性与安 ...

  5. 基于 Token 的身份验证和安全问题

    1 前言 最近为了学习 Token 知识,博主在网上狂搜资料,其中发现了两篇博文对 Token 的讲解特别详细的,博主看过之后感觉受益匪浅,现将两篇博文整合成一篇博文发布出来,从而分享给大家,希望能够 ...

  6. 用户数据表设计借鉴 浅谈数据库用户表结构设计,第三方登录 基于 Token 的身份验证

    最近对用户数据表的设计比较感兴趣,看到了两篇比较好的文章. 浅谈数据库用户表结构设计,第三方登录 转载于: https://www.cnblogs.com/jiqing9006/p/5937733.h ...

  7. 基于Token进行身份验证

    1.基于服务器的验证 我们都是知道HTTP协议是无状态的,这种无状态意味着程序需要验证每一次请求,从而辨别客户端的身份.  在这之前,程序都是通过在服务端存储的登录信息来辨别请求的.这种方式一般都是通 ...

  8. 基于 Token 的身份验证方法

    基于 Token 的身份验证方法 使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的:客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成 ...

  9. 【转】基于Token的身份验证原理

    目录 1 发展史 2 Cookie 3 Session 3.1 cookie和session的区别 4 Token 4.1 传统方式--基于服务器的验证 4.2 基于服务器验证方式暴露的一些问题 4. ...

最新文章

  1. 如何阅读JAVA 字节码(一)
  2. Spring源码系列:BeanDefinition源码解析
  3. 事件触发控制_前端性能优化:事件的节流throttle与防抖debounce
  4. 天谕手游会长大人与司空望月,谁的人气更高?都是NPC,别比了
  5. Java黑皮书课后题第6章:*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数。编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数
  6. ASP.NET常用代码
  7. 转:libev和libevent的设计差异
  8. 顺便抹了下眼眶的飞鸽传书官方网站
  9. 【ES6】对象、函数、数组的扩展
  10. 《消费者报告》杂志:Model 3和Model S被评选为美国最佳豪华汽车
  11. 初者Python笔记(案例:用字典无限添加节点)
  12. oracle的tns错误,Oracle TNS-12514错误的解决步骤
  13. OpenGL+VS2012环境搭建
  14. vue全屏组件vue-fullscreen使用
  15. matlab盒子分形维数_根据计盒维数原理求一维曲线分形维数的matlab程序
  16. 叙述码农和程序员的不同之处
  17. 嵌入式开发有年龄限制吗_32岁入门晚不晚?来听听这位70后程序员的故事
  18. Android 毕业设计高仿抖音(视频类App)(内附源码)
  19. 为什么用GDP平减指数算通胀率与用消费物价指数算通胀率答案不同?
  20. android 静音接口,android 静音方法

热门文章

  1. 自定义分页(模块化)
  2. Spring IOC之依赖
  3. 导入Excel和CSV文件
  4. 四门专业课,有点困难哈~
  5. 计算机网络-UDP协议
  6. C语言经典例18-求累加和
  7. 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质 | x(n) 分解为实部序列与虚部序列 | 实部傅里叶变换 | 虚部傅里叶变换 | 共轭对称傅里叶变换 | 共轭反对称傅里叶变换 )
  8. 【Git】Git 基础命令 ( Git 版本库概念 | 创建版本库 git init | 克隆版本库 git clone )
  9. 【错误记录】Flutter 运行报错 Error -32000 received from application: There are no running service protocol
  10. 【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )