JWT是啥?

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

A.B.C

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

怎样生成A?

header格式为:

  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了,重在说明字段含义:

  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

    初次了解JWT,很基础,高手勿喷. 基于Token的身份验证用来替代传统的cookie+session身份验证方法中的session. JWT是啥? JWT就是一个字符串,经过加密处理与校验处理的字符 ...

  2. 基于token的身份验证JWT

    传统身份验证的方法 HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下 ...

  3. 基于Token的身份验证--JWT

    初次了解JWT,很基础,高手勿喷. 基于Token的身份验证用来替代传统的cookie+session身份验证方法中的session. JWT是啥? JWT就是一个字符串,经过加密处理与校验处理的字符 ...

  4. 基于Token的身份验证——JWT(转)

    本文转自:http://www.cnblogs.com/zjutzz/p/5790180.html 感谢作者 初次了解JWT,很基础,高手勿喷.基于Token的身份验证用来替代传统的cookie+se ...

  5. 基于 Token 的身份验证:JSON Web Token(JWT)

    1.传统身份验证和JWT的身份验证 传统身份验证:       HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过 ...

  6. (转)基于 Token 的身份验证

    原文:https://ninghao.net/blog/2834 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,G ...

  7. 基于 Token 的身份验证:JSON Web Token(附:Node.js 项目)

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

  8. [转载]基于 Token 的身份验证

    作者:王皓发布于:2015-08-07 22:06更新于:2015-08-07 22:07 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twit ...

  9. JavaWeb—基于Token的身份验证

    传统身份验证的方法 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RES ...

随机推荐

  1. C++虚函数与多态

    C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写.(这里我觉得要补充,重写的话可以有两种,直接重写成员函数和重写虚函 ...

  2. linux进程原语之fork()

    一.用法解析: fork()这个函数,可以说是名如其人了,众所周知fork这个单词本意为叉子,老外取学术名字的时候总会有一些象形的想法,于是就有了下图~ fork()函数是计算机程序设计中的分叉函数. ...

  3. nyoj 1237 简单dfs

    最大岛屿 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海盗,你知道吧?杰克船长驾驶着自己 ...

  4. 字符串练习——唐纳德与子串 (Easy)

    G1. 唐纳德与子串 (Easy) Time limit per test: 1.0 seconds Memory limit: 256 megabytes 子串的定义是在一个字符串中连续出现的一段字 ...

  5. 84. Largest Rectangle in Histogram *HARD* -- 柱状图求最大面积 85. Maximal Rectangle *HARD* -- 求01矩阵中的最大矩形

    1. Given n non-negative integers representing the histogram's bar height where the width of each bar ...

  6. drawImage

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  7. app.jsNodejs启动测试服务

    'use strict'; var express = require('express');var app = express('');var fs = require('fs'); app.get ...

  8. hdu3613

    题解: EX_KMP 网上似乎说kmp也可以,但是我交了一发代码没过 然后标记一下哪一些前缀和后缀会问 暴力枚举拆开了的位置 代码: #include<cstdio> #include&l ...

  9. TMemo Ctrl + A

    http://delphi.about.com/od/adptips2004/a/bltip0804_4.htm Here's how to implement the code for the CT ...

  10. 坏消息:百度影音、快播关闭P2P服务器!

    继日前优酷土豆集团.搜狐视频.腾讯视频.乐视网.中国电影著作权协会(MPA).美国电影协会 (MPAA).日本内容产品流通海外促进机构(CODA).万达影业.光线传媒.乐视影业联合发布“中国网络视频反 ...