Web验证方式(4)--JWT
OAuth协议中说到的AccessToken可以是以下两种:
1.任意只起到标识作用的字符串:这种情况下Resource Server处理请求时需要去找Authorization Server获取用户信息。
2.携带用户基本信息的加密字符串:这种情况下Resource Server处理请求时只需解析AccessToken,直接获取到用户信息即可。
JWT就是用来生成第二种access token的一种协议。具体介绍:JWT
具体来说,一个JWT token就是如下一串字符串:

这个字符串由3部分(Header, Payload, Signature)组成,用"."分隔。
Header
这一部分时用来定义构造JWT的参数信息,用一个JSON对象表示如下:
{
"alg": "HS256",//定义JWT中的Signature所用的算法
"typ": "JWT"//表示Token的类型,此处统一写成JWT
}
将上述JSON对象的字符串形式进行Base64Url编码之后就得到了token中的header部分。
Payload
这一部分是存储业务信息的地方。信息也以JSON对象的方式表示:
{
"iss": "Jensen",//签发人
"exp": "1308726283"//token过期时间戳
}
对象中的key其实可以为任意字符串。但是为了让token字符串尽可能小。key尽量统一为3各字符。然后为了将一些常用的key标准化,JWT定义了如下标准key:
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
详见 RFC7519
当然我们也可以定义自己的key,比如:name:姓名,admin:是否为admin...
将上述JSON对象的字符串形式进行Base64Url编码之后就得到了token中的payload部分。
Signature
将header和payload部分的base64字符串用特定的密钥进行hash得到签名部分。比如我们选用HMAC SHA256作为签名算法,则签名过程如下:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
secret只有服务器端才知道,通过签名可以防止token被修改。
与OAuth验证结合
采用这种方式生成的access token, Resouce Server处理请求的时候(access token可以放在Authorization Header中,比如:Bearer xxxx)可以直接解析。但是这里有
两个问题:
1. Authorization Server和Resource Server如何共享签名的secret?
最简单的方法就是Resource Server和Authorization Server使用统一的secret。但是这样的话如果有很多Resource Server(比如不同的资源提供者)共用一个Authorization
Server的话可能就有安全问题,这种情况下就需要针对不同的resource server使用不同的secret进行签名了。同时client在申请token的时候也需要告知要访问那个resource server。
2. Token的失效问题
因为Token是在Resource Server直接解析,意味着一旦签发,在其到期前一直有效。用户logout后也没办法将已经产生的token设置为无效。
要解决这个问题,还是需要Resource Server将access token提交至Authorization Server验证。Authorization Server可以将access token进行缓存或者
缓存采用相关算法为其生成的key(比如用签名作为key),验证时只需验证key是否存在即可。(当然,我们我进行失效处理时可以把缓存的key删掉即可)
Web验证方式(4)--JWT的更多相关文章
- Web验证方式(3)--OAuth 2.0协议
介绍 OAuth协议是用来解决第三方应用程序访问Http Service的时候的认证问题.举个例子:某视频网站支持用户通过微信登陆,然后获取用户在微信上的图像信息. 在这个场景里 微信充当的就是Htt ...
- Web验证方式(2)--Form Authentication
Form验证方式并不是HTTP标准,而是在微软ASP.NET Web框架下提供的一种验证方式.其大致流程如下: 在上图的流程中,ASP.NET框架提供了如下支持类:( FormsAuthenticat ...
- Web验证方式(1)--Http Basic Authentication
Http Basic Authentication是HTTP协议中定义的Web系统中的验证方式.参考wiki 主要的实现机制如下: 1. 用户通过浏览器匿名访问web资源. 2. web服务器检测到w ...
- Web.xml中四种验证方式
源地址:https://blog.csdn.net/imimi_/article/details/78805642 <security-constraint> 的子元素 <http- ...
- 两系统用asp.net forms 身份验证方式实现跨域登录信息共享
1.两个系统的 web.config 都配置为 forms 验证方式( system.web —> authentication 节点) 2.在两个系统的Web.config里配置相同的 sys ...
- Asp.net Mvc4 基于Authorize实现的模块权限验证方式
在MVC中,我们可以通过在action或者controller上设置Authorize[Role="xxx"] 的方式来设置用户对action的访问权限.显然,这样并不能满足我们的 ...
- Webservice加上SoapHeader验证方式
提供一种基于SoapHeader的自定义验证方式,代码如下: public class MySoapHeader : System.Web.Services.Protocols.SoapHeader ...
- IIS下的身份验证方式管理
设置.查看身份验证方式 #导航到某站点下: cd IIS:\Sites\DemoSite\DemoApp #启用站点test01下的Windows身份验证 Set-WebConfigurationPr ...
- asp.net中常用的几种身份验证方式
转载:http://www.cnblogs.com/dinglang/archive/2012/06/03/2532664.html 前言 在B/S系统开发中,经常需要使用"身份验证&q ...
随机推荐
- Core Java 6
p277~p279: 1.使用解耦合的 try/catch 和 try/finally 语句块可以提高代码的清晰度,并且会报告 finally 子句中出现的错误. 2.假设利用 return 语句从 ...
- CF_884_F(NetFlow)
codeforces_884_f 题目大意:给出一串长为n的字符串(保证n为偶数),定义反回文串为每一个位置的对应位置上的字母都不等于它(for each i : s[i] != s[n+1-i]), ...
- python应用-matplotlib绘图
详细内容参看:官网 测试数据: # 传入的参数 x=[1,2,3,4,5] squares=[1,4,9,16,25] 简单的绘图 import matplotlib.pyplot as plt de ...
- Python - TypeError: unicode argument expected, got 'str'
参考:TypeError: unicode argument expected, got 'str' Python代码: from io import StringIO def main(): f = ...
- 【Nature 子刊】I型HLA基因中和癌症相关的体细胞突变--转载
肿瘤的发生与免疫系统的功能密切相关.在免疫系统中,MHC(主要组织相容性复体,majorhistocompatibilitycomplex)是所有生物相容复合体抗原的一种统称.HLA(humanleu ...
- Qt532__std::numeric_limits<qint64>::min();
1.C:\Qt\Qt5.3.2_vs10_opengl\5.3\msvc2010_opengl\include\QtCore\qdatetime.h static inline qint64 null ...
- OpenGL超级宝典笔记——遮挡查询 [转]
目录[-] 遮挡查询之前 包围体 遮挡查询 在一个场景中,如果有有些物体被其他物体遮住了不可见.那么我们就不需要绘制它.在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率.遮挡查询就是 ...
- BeginInit与EndInit的实践总结
在项目中,遇到这种情况,总结随便如下: 初始化时:添加操作,BeginInit{flag=true} 警情是一条条加入的,全部都加入后,图表再一次性生成 EndInit{flag=false} ...
- devdocs
https://devdocs.io/ docker run --rm -d --name devdocs -p 9292:9292 devdocs/devdocs
- HDU 5816 状压DP&排列组合
---恢复内容开始--- Hearthstone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...