什么是(JWT)JSON Web Token ?
- 官网介绍
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地将信息作为JSON对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公用/专用密钥对对JWT进行签名...pilipala...看不进去了。 - 下面就来简单的总结下JWT
- 简单来说:JWT是一个JSON信息传输的开放标准,它可以使用密钥对信息进行数字签名,以确保信息是可验证和可信任的。
-
JWT基于token的鉴权机制
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。
JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。除了用户id之外,还可以存储其他的和用户相关的信息,例如用户角色,用户性别等。
- 请求流程
1、用户使用用户名密码来请求服务器
2、服务器进行验证用户的信息
3、服务器通过验证发送给用户一个token
4、客户端存储token,并在每次请求时附送上这个token值
5、服务端验证token值,并返回数据 - JWT的结构:WT由三部分构成:header(头部)、payload(载荷)和signature(签名)。 以紧凑的形式由这三部分组成,由“.“分隔。[格式:aaaaa.bbbbb.ccccc]
- 下面就来剖析下这一大串的字符
- header:通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA等等。
eg:
- header:通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA等等。
{ "alg": "HS256", "typ": "JWT" }
- 显而易见,这是一个json数据,然后这货会被Base64编码形成JWT的第一部分,也就是aaaaa.bbbbb.ccccc中的aaaaaa
eg:
{
"iss": "www.baidu.com",
"sub": "you",
"aud": "me",
"name": "456",
"admin": true,
"iat": 1584091337,
"exp": 1784091337,
}
- 上面同样会被Base64编码,然后形成JWT的第二部分,也就是aaaaa.bbbbb.ccccc中的bbbbb
- signature
这是JWT的第三部分,叫做签名,此部分用于防止JWT内容被篡改。将上面的两个编码后的字符串都用英文句号.连接在一起(头部在前),就形成了[aaaaa.bbbbb]
然后再使用header中声明签名算法进行签名。 如果要使用HMAC SHA256算法,则将通过以下方式创建签名
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
-
当然,在加密的时候,我们还需要提供一个密钥(secret),我们可以自己随意指定。这样就形成了JWT的第三部分,也就是aaaaa.bbbbb.ccccc中的ccccc
最后,我们把这三个部分拼在一起,就形成了一个完整的JWT
如果我们想试验一下的话,可以在JWT的官网进行debugger。贴一下官网: https://jwt.io/ -
附JSON Web Token认证流程
-
JWT使用场景
- 授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单一登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用
项目中JWT生成规则示例:
- 授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单一登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用
@Test
public void getToken() {
//client-id
String clientId = "";
//client-secret
String clientSecret = "";
//系统地址
String url = "https://xxx.com";
//接口地址
String api = "/api/xxx";
Map<String, Object> requestMap = new HashMap<>();
long timestamp = System.currentTimeMillis();
String rand = UUID.randomUUID().toString();
String sigin = this.tokenSignature(timestamp + "", rand, clientId, clientSecret);
requestMap.put("timestamp", timestamp);
requestMap.put("rand", rand);
requestMap.put("clientId", clientId);
requestMap.put("signature", sigin);
url = url + api;
String resultStr = HxHttpClient.postJson(url, requestMap);
System.out.println(resultStr);
}
- 信息交换:JSON Web Token是在各方之间安全地传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以您可以确定发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否遭到篡改。
网友评论