json web token 网上学习笔记

摘要:
JSONWebToken-实现系统集成授权访问这是使用JWT授权访问AnyReport报告系统的第三方系统。AnyReport报告系统公开报告资源URL,供第三方系统访问。第三方系统可以使用iframe。src被设置为访问报表资源的报表链接。此时,资源URL类似于restulapi,需要由经过身份验证的系统访问。JWT的优点是不需要进行登录身份验证就可以在服务器端建立会话。签名部分是使用headerBase64和payloadBase64的密钥加密的Base64字符串。12345678910111213 functiontoken(){varbase64=newBase64();//在线查找base64库varheader='“typ”:“JWT”,“alg”:“HS256”}';varheaderBase64=base64.encode;//Headerbase64字符串vardate=newDate();varpayload=“{”cid“:”OA0001“,”iat“:1482656248798,”uid“:”admin“}”;varpayloadBase64=base64.encode;//Payloadbase64 string varbase64Token=headerBase64+“.”+Payloadbase64;varsignature=CryptoJS.HmacSHA256;//使用Google的hmac-sha256.js库varsignatureBase64=base64.hex2b64;varjwt=base64Token+“.”+签名Base64;returnjwt;}生成的base64令牌用作URL请求资源,并且URL需要是urlencoding 12//URL?
JSON Web Token(JWT) - 实现系统集成授权访问

这是一个第三方系统访问AnyReport报表系统使用JWT授权的实现案例,AnyReport报表系统暴露报表资源URL供第三方系统访问,
第三方系统可以使用iframe,src设置为报表链接访问报表资源,这时资源URL类似restful api需要被认证的系统才能访问,
通过JWT的好处是不需要做登录认证在服务器端建立session。

JWT组成部分

JSON web Token 简称JWT,是一种token的URL安全方法,用于在网络通信的双方之间传递
JWT传输内容是由头部 header、负载 payload、签名 signature 三部分组成
header 定义Token 类型、加密类型,告诉服务器端使用的加密方法是HmacSHA256(HS256)

1
2
3
4
{
  "typ":"JWT",
  "alg":"HS256"
}

负载 payload 定义一些需要使用的信息:客户端ID、JWT创建的时间、用户ID,负载中不需要传输敏感信息如密码、密钥等,JWT内容通过HTTP传输不安全。

1
2
3
4
5
{
  "cid": "OA0001",
  "iat": 1482656248798,
  "uid": "admin"
}

cid:是第三方系统的标示,因为可能多个第三方系统访问报表系统,报表系统可以根据cid查询密钥、失效时间等做JWT内容验证。
iat:创建JWT的时间,服务器端根据该iat判断JWT是否已经失效了,防止链接被别人获取。
uid:用户ID,服务器端可以根据该用户查询一些用户相关的信息,如一些权限信息,这个案例并没有使用这个字段。

签名 signature 部分是使用密钥对header Base64与payload Base64加密的Base64字符串。
JWT三个部分使用“.”链接的字符串, 最终JWT是:header base64字符串 + payload base64 字符串 + HmacSHA256(headerBase64 + "." + payloadBase64) base64字符串

1
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjaWQiOiJPQTAwMDEiLCJpYXQiOjE0ODI2NTcyODQyMjF9.TeJpy936w610Vrrm+c3+RXouCA9k1AX0Bk8qURkYkdo=

JWT生成方法

JWT是由第三方系统生成的,可以使用服务器端语言,也可以使用Javascript生成,这种方式是最简单的,密钥保存在第三方系统服务器端当进入页面可以将密钥给js, js获取密钥而生成JWT,这里第三方系统密钥与报表系统密钥一致,各保留一份无需传输。

1
2
3
4
5
6
7
8
9
10
11
12
13
functiontoken() {
    varbase64 = newBase64();//网上寻找一个base64库
    varheader= '{"typ":"JWT","alg":"HS256"}';
    varheaderBase64 = base64.encode(header);//header base64字符串
    vardate = newDate();
    varpayload = '{"cid" : "OA0001","iat" : 1482656248798,"uid" : "admin"}';
    varpayloadBase64 = base64.encode(payload); //payload base64字符串
    varbase64Token = headerBase64 + "."+ payloadBase64;
    varsignature = CryptoJS.HmacSHA256(base64Token, "123456"); //使用google的hmac-sha256.js库
    varsignatureBase64 = base64.hex2b64(signature.toString());
    varjwt = base64Token + "."+ signatureBase64;
    returnjwt;
}

生成的base64的token作为URL请求资源,url还需要做urlencoding编码

1
2
//url?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjaWQiOiJPQTAwMDEiLCJpYXQiOjE0ODI2NTcyODQyMjF9.TeJpy936w610Vrrm%2Bc3%2BRXouCA9k1AX0Bk8qURkYkdo%3D
url?jwt=encodeURIComponent(token());

JWT验证

验证是在报表系统服务器端进行,验证部分比较简单的,采用Java解析JWT并做验证, 首选将jwt按“.“分割为parts三部分header,payload、signature, 使用js相同的密钥如“123456”进行加密,得到加密结果与jwt的signature进行比较,如果相等表示验证通过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
publicstaticbooleanverify(String jwt) {
    String[] parts = jwt.split("\.");
    String payload = StringUtils.newStringUtf8(Base64.decodeBase64(parts[1]));
    JSONObject json = JSONObject.fromObject(payload);
    String clientId = json.getString("cid");
    longiatTime = json.getLong("iat");
    //验证jwt是否失效
    if(System.currentTimeMillis() - iatTime > 3600* 1000) {
        returnfalse;
    }
    //验证签名 signature
    byte[] content = (parts[0] + "."+  parts[1]).getBytes(StandardCharsets.UTF_8);
    byte[] signature = Base64.decodeBase64(parts[2]);
    try{
        returnverifySignatureFor("HmacSHA256", "123456", content, signature);
    } catch(Exception e) {
        thrownewRuntimeException(e);
    }
 
}
 
publicstaticbooleanverifySignatureFor(String algorithm,  String secret, byte[] contentBytes, byte[] signatureBytes) throwsException {
    byte[] secretBytes = secret.getBytes(StandardCharsets.UTF_8);
    Mac mac = Mac.getInstance(algorithm);
    mac.init(newSecretKeySpec(secretBytes, algorithm));
    returnMessageDigest.isEqual(mac.doFinal(contentBytes), signatureBytes);
}

©2017 中普软件 All Rights Reserved.

免责声明:文章转载自《json web token 网上学习笔记》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【Hadoop】用 Ganglia 监控hadoop集群Libevent::evhttp服务器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

局域网永恒之蓝病毒发包的解决方案之二

1. 使用shadowbroker 的 eternalblue还有 doublepulsar 实现注入到目标机器的进程, 然后使用kali下的msf 获取到有病毒机器的shell 然后修改密码 查看问题等. 根据网上的教程来进行处理 以及复现等 教程地址: http://blog.csdn.net/claygrit/article/details/7728...

iOS开发之—— 加密使用(MD5,base64,DES,AES)

基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法)SHA(Secure Hash Algorithm,安全散列算法)HMAC(Hash Message Authentication Code,散列消息鉴别码) MD5、SHA、HMAC这三种加密算法,可谓是非...

Nginx实现JWT验证-基于OpenResty实现

介绍 权限认证是接口开发中不可避免的问题,权限认证包括两个方面 接口需要知道调用的用户是谁 接口需要知道该用户是否有权限调用 第1个问题偏向于架构,第2个问题更偏向于业务,因此考虑在架构层解决第1个问题,以达到以下目的 所有请求被保护的接口保证是合法的(已经认证过的用户) 接口可以从请求头中获取当前用户信息 每个请求都有uuid用于标识 JWT(J...

python抓取NBA现役球员基本信息数据并进行分析

链接:http://china.nba.com/playerindex/ 所需获取JSON数据页面链接:http://china.nba.com/static/data/league/playerlist.json 数据来源:NBA中国官网 库: requests 用于解析页面文本数据 pandas   用于处理数据 时间: 2017/2/17 (因为为现...

python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别

1.python2将base64数据写成图片,并将数据转为16进制字符串的方法 import binascii img = u'R0lGODlhagAeAIcAAAAAAAAARAAAiAAAzABEAABERABEiABEzACIAACIRACIiACIzADMAADMRADMiADMzADd3REREQAAVQAAmQAA3QBVAABVVQ...

WebSocket 详解

HTTP 协议在设计上就是一个单向的网络协议,服务器只能被动的接收请求,然后返回相应的数据。对于需要双向通信的场景,虽然可以通过轮询,Comet 等方式实现,但每次链接都要三次握手,效率低下。 与http比较: 1.都基于 TCP 的、应用层的可靠性传输协议 2.WebSocket 在握手时的数据是通过 HTTP 传输的,一旦连接建立后就不再依赖 HTT...