json web token 网上学习笔记

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

function token() {

    var base64 = new Base64();//网上寻找一个base64库

    var header= ‘{"typ":"JWT","alg":"HS256"}‘;

    var headerBase64 = base64.encode(header);//header base64字符串

    var date = new Date();

    var payload = ‘{"cid" : "OA0001","iat" : 1482656248798,"uid" : "admin"}‘;

    var payloadBase64 = base64.encode(payload); //payload base64字符串

    var base64Token = headerBase64 + "." + payloadBase64;

    var signature = CryptoJS.HmacSHA256(base64Token, "123456"); //使用google的hmac-sha256.js库

    var signatureBase64 = base64.hex2b64(signature.toString());

    var jwt = base64Token + "." + signatureBase64;

    return jwt;

}

生成的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

public static boolean verify(String jwt) {

    String[] parts = jwt.split("\\." );

    String payload = StringUtils.newStringUtf8(Base64.decodeBase64(parts[1]));

    JSONObject json = JSONObject.fromObject(payload);

    String clientId = json.getString("cid");

    long iatTime = json.getLong("iat");

    //验证jwt是否失效

    if(System.currentTimeMillis() - iatTime > 3600 * 1000) {

        return false;

    }

    //验证签名 signature

    byte[] content = (parts[0] + "." +  parts[1]).getBytes(StandardCharsets.UTF_8);

    byte[] signature = Base64.decodeBase64(parts[2]);

    try {

        return verifySignatureFor("HmacSHA256", "123456", content, signature);

    } catch(Exception e) {

        throw new RuntimeException(e);

    }

}

public static boolean verifySignatureFor(String algorithm,  String secret, byte[] contentBytes, byte[] signatureBytes) throws Exception {

    byte[] secretBytes = secret.getBytes(StandardCharsets.UTF_8);

    Mac mac = Mac.getInstance(algorithm);

    mac.init(new SecretKeySpec(secretBytes, algorithm));

    return MessageDigest.isEqual(mac.doFinal(contentBytes), signatureBytes);

}

?2017 中普软件 All Rights Reserved.

时间: 2024-10-09 00:07:36

json web token 网上学习笔记的相关文章

使用json web token

由来 做了这么长时间的web开发,从JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用php框架thinkPHP,到现在的nodejs,我自己的看法是越来越喜欢干净整洁的web层,之前用jsf开发做view层的时候,用的primefaces做的界面显示,虽然primefaces的确提供了很大的便利,可以让开发人员专注于业务逻辑开发,这样其实就省去了前端开发的工作.而后来发现有些客户需要的展现形式很难实现,或者通过拼凑的方法实现的结果效率不高.使用

理解JWT(JSON Web Token)认证

最近想做个小程序,需要用到授权认证流程.以前项目都是用的 OAuth2 认证,但是Sanic 使用OAuth2 不太方便,就想试一下 JWT 的认证方式.这一篇主要内容是 JWT 的认证原理,以及python 使用 jwt 认识的实践. 几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth 在HTTP中,基本认证是一种用来允许Web浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式,通常用户名和明码会通过HTTP头传递. 在发送之前是以用

JWT(JSON Web Token)

摘要: 在Web应用中,使用JWT替代session并不是个好主意 适合JWT的使用场景 抱歉,当了回标题党.我并不否认JWT的价值,只是它经常被误用. 什么是JWT 根据维基百科的定义,JSON WEB Token(JWT,读作 [/d??t/]),是一种基于JSON的.用于在网络上声明某种主张的令牌(token).JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature). 头信息指定了该JWT使用的签名算法: header = '{"alg&q

你知道你对 JSON Web Token 的认识存在误解吗

1.前言 JSON Web Token (JWT) 其实目前已经广为软件开发者所熟知了,但是 JOSE (Javascript Object Signing and Encryption) 却鲜有人知道,我第一次知道它是在 Spring Security 的官方文档中,它改变了我对 JWT 的一些认识.目前国内能找到相关中文资料不是太多.所以我觉得有必要归纳一下. 2. JOSE 概述 JOSE 是一种旨在提供在各方之间安全传递声明(claims)的方法的规范集.我们常用的 JWT 就包含了允许

JSON Web Token 是什么?

原文:JSON Web Token 是什么? 阅读目录 简介 JWT应用场景 JWT数据结构 JWT如何使用? 为什么要使用JWT? 后记 链接 免费获得官方JWT手册并深入学习JWT吧! 回到顶部 简介 JSON Web Token(缩写JWT),是一套开放的标准(RFC 7519),它定义了一种紧凑且自URL安全的方式,以JSON对象的方式在各方之间安全地进行信息传输.由于此信息是经过数字签名的,因此是可以被验证和信任的.可以使用密钥(secret)(使用HMAC算法)或者使用RSA或ECD

八幅漫画理解使用 JSON Web Token 设计单点登录系统

原文出处: John Wu 上次在<JSON Web Token – 在Web应用间安全地传递信息>中我提到了JSON Web Token可以用来设计单点登录系统.我尝试用八幅漫画先让大家理解如何设计正常的用户认证系统,然后再延伸到单点登录系统. 如果还没有阅读<JSON Web Token – 在Web应用间安全地传递信息>,我强烈建议你花十分钟阅读它,理解JWT的生成过程和原理. 用户认证八步走 所谓用户认证(Authentication),就是让用户登录,并且在接下来的一段时

JSON Web Token in ASP.NET Web API 2 using Owin

In the previous post Decouple OWIN Authorization Server from Resource Server we saw how we can separate the Authorization Server and the Resource Server by unifying the "decryptionKey" and "validationKey" key values in machineKey node

Json Web Token身份认证

用户身份认证一般有5种方式 HTTP Basic authentication在发送请求时在HTTP头中加入authentication字段,将用Base64编码的用户名和密码作为值,每次发送请求的时候都要发送用户名和密码,实现比较简单. Cookies向后台发送用户名和密码,在用户名和密码通过验证后,保存返回的Cookie作为用户已经登录的凭证,每次请求时附带这个Cookie Signatures用户拿到服务器给的私钥,在发送请求前,将整个请求使用私钥来加密,发送的将是一串加密信息,此方式只适

利用Redis撤销JSON Web Token产生的令牌

利用Redis撤销JSON Web Token产生的令牌 作者:chszs.版权全部.未经允许,不得转载.博主主页:http://blog.csdn.net/chszs 早先的博文讨论了在Angular.js和Node.js中使用jsonwebtoken实现认证授权的案例.这里要说明一下,当用户点击了"注销"button,用户的令牌在Angular端会从授权认证服务AuthenticationService中移除,可是此令牌仍旧是有效的,还能够被攻击者窃取到.用于API调用,直至jso