Skip to content

Commit 9ab1902

Browse files
committed
Jwt完善
1 parent 5c3dc09 commit 9ab1902

2 files changed

Lines changed: 38 additions & 10 deletions

File tree

img/others/json-web-token.png

60.3 KB
Loading

其他/note.md

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ GET http://api.qc.com/v1/friends
4747

4848
## JWT
4949

50-
[JWT教程](http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html)
50+
[JWT教程](http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) | [数字签名](https://blog.csdn.net/qq_21514303/article/details/82898984)
5151

5252
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。
5353

54-
用户认证一般流程
54+
session认证流程
5555

5656
1、用户向服务器发送用户名和密码。
5757

@@ -63,31 +63,59 @@ JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。
6363

6464
5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
6565

66-
JWT只通过算法实现对Token合法性的验证,不依赖数据库,Memcached的等存储系统,因此可以做到跨服务器验证,只要密钥和算法相同,不同服务器程序生成的Token可以互相验证。
66+
如果需要跨域认证,即用户登录了a网站,再访问b网站需要自动登录,则要求session数据共享。可以将session数据持久化,存到数据库来实现session共享。
67+
68+
JWT不在服务器端保存session数据,所有数据都保存在客户端,每次请求都发回服务器。它是通过算法实现对Token合法性的验证,不依赖数据库,只要密钥和算法相同,**不同服务器程序生成的Token可以互相验证**
6769

6870
### 原理
6971

70-
服务器认证以后,生成一个 JSON 对象,发回给用户。
72+
用户使用用户名和密码登录服务器。服务器认证完成后,使用私钥生成一个 JSON 对象(包括用户名、权限等),发回给用户。
7173

7274
```json
7375
{
74-
"姓名": "张三",
75-
"角色": "管理员",
76-
"到期时间": "2018年7月1日0点0分"
76+
"username": "张三",
77+
"roles": "管理员",
78+
"expire": "2018年7月1日0点0分"
7779
}
7880
```
7981

80-
以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认证用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候会加上签名
82+
以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器依据JSON对象认证用户身份。为了防止用户篡改数据,服务器在生成JSON对象的时候会使用私钥进行加密生成签名
8183

84+
![](../img/others/json-web-token.png)
8285

86+
### 数据结构
8387

88+
JWT数据分为三个部分:
8489

90+
- Header(头部)
91+
- Payload(负载)
92+
- Signature(签名)
8593

94+
Header和Payload会使用 Base64URL 算法转成字符串,然后三部分用`.`进行分隔:
8695

96+
```javascript
97+
Header.Payload.Signature
98+
```
8799

88-
在mysql中, 如果类型为时间的列设置了CURRENT_TIMESTAMP, 那么在insert一条新记录, 时间字段自动获取到当前时间, 如果设置了ON UPDATE CURRENT_TIMESTAMP, 则时间字段随着update命令的更新和实时变化。 如果两个属性都设置了, 那么时间字段默认为当前时间, 且随着记录的更新而自动变化。 注意, 如果仅仅是update操作, 但id并没有实际变更, 则时间值也不会变化
100+
Header 部分是一个 JSON 对象,描述 JWT 的元数据
89101

90-
如果时间字段没有设置如上两个属性, 则默认拥有如上两个属性。
102+
```javascript
103+
{
104+
"alg": "HS256",
105+
"typ": "JWT"
106+
}
107+
```
108+
109+
Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据,如用户名、权限等。
110+
111+
Signature 部分是对前两部分的签名,防止数据篡改。首先需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后使用 Header 里面指定的签名算法(默认是 HMAC SHA256),根据下面的公式产生签名。
112+
113+
```javascript
114+
HMACSHA256(
115+
base64UrlEncode(header) + "." +
116+
base64UrlEncode(payload),
117+
secret)
118+
```
91119

92120

93121

0 commit comments

Comments
 (0)