原文地址: http://www.itdecent.cn/p/9f80be6ba2e9
前言
想一想,代碼寫多了,東西看多了之后,對(duì)很多名詞和概念的名字很熟,但是不清楚名字背后的內(nèi)容以及它們之間的聯(lián)系?
比如OAuth,Token和JWT,下面是常見的一些疑問,本文將試著來解答這些問題:
- 什么是OAuth?
- 什么是Token?
- 什么又是JWT?
- 三者之間又是什么關(guān)系?
1. OAuth
1.1 定義
OAuth: An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications. 也就是說OAuth是一個(gè)開放標(biāo)準(zhǔn),提供了一種簡(jiǎn)單和標(biāo)準(zhǔn)的安全授權(quán)方法,允許用戶無需將某個(gè)網(wǎng)站的用戶名密碼提供給第三方應(yīng)用就可以讓該第三方應(yīng)用訪問該用戶在某網(wǎng)站上的某些特定信息(如簡(jiǎn)單的個(gè)人信息)。
1.2 歷史
1.3 OAuth 2.0 協(xié)議處理流程
+--------+ +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+
具體的詳細(xì)介紹可以參考軟大師的: 理解OAuth 2.0
2. Token
Token就是獲取信息的憑證,如上述的Access Token,關(guān)于Token的具體使用有相應(yīng)的RFC文件指導(dǎo): The OAuth 2.0 Authorization Framework: Bearer Token Usage
2.1 Access Token 類型
Token的類型可分為兩種:
-
bearer. 包含一個(gè)簡(jiǎn)單的Token字符串. -
mac. 由消息授權(quán)碼(Message Authentication Code)和Token組成.
示例:
// bearer
GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Bearer mF_9.B5f-4.1JqM
// mac
GET /resource/1 HTTP/1.1
Host: example.com
Authorization: MAC id="h480djs93hd8",
nonce="274312:dj83hs9s",
mac="kDZvddkndxvhGRXZhvuDjEhGeE="
2.2 認(rèn)證請(qǐng)求方式
使用Token的認(rèn)證請(qǐng)求的方式有三種,客戶端可以選擇一種來實(shí)現(xiàn),但是不能同時(shí)使用多種:
- 放在請(qǐng)求頭
- 放在請(qǐng)求體
- 放在URI
詳細(xì)如下:
2.2.1 放在請(qǐng)求頭
放在Header的Authorization中,并使用Bearer開頭:
GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM
2.2.2 放在請(qǐng)求體
放在body中的access_token參數(shù)中,并且滿足以下條件:
- HTTP請(qǐng)求頭的
Content-Type設(shè)置成application/x-www-form-urlencoded. - Body參數(shù)是
single-part. - HTTP請(qǐng)求方法應(yīng)該是推薦可以攜帶Body參數(shù)的方法,比如
POST,不推薦GET.
示例:
POST /resource HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
access_token=mF_9.B5f-4.1JqM
2.2.3 放在URI
放在uri中的access_token參數(shù)中
GET /resource?access_token=mF_9.B5f-4.1JqM
Host: server.example.com
3. JWT
JWT: JSON Web Tokens, 這是一個(gè)開放的標(biāo)準(zhǔn),規(guī)定了一種Token實(shí)現(xiàn)方式,以JSON為格式,相應(yīng)的RFC文件為: JSON Web Token (JWT)
JWT的結(jié)構(gòu)分為三個(gè)部分:
- Header: 存放Token類型和加密的方法
- Payload: 包含一些用戶身份信息.
- Signature: 簽名是將前面的Header,Payload信息以及一個(gè)密鑰組合起來并使用Header中的算法進(jìn)行加密
最終生成的是一個(gè)有兩個(gè).號(hào)連接的字符串,前兩個(gè)部分是Header和Payload的Base64編碼,最后一個(gè)是簽名,如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.MejVLl-m7KMfaay0nXxDWGEVPWsQ2f6SZnTvq4fXaLI
詳細(xì)內(nèi)容參考: Introduction to JSON Web Tokens
4. 問題解答
4.1 什么是OAuth?
也就是說OAuth是一個(gè)開放標(biāo)準(zhǔn),提供了一種簡(jiǎn)單和標(biāo)準(zhǔn)的安全授權(quán)方法,允許用戶無需將某個(gè)網(wǎng)站的用戶名密碼提供給第三方應(yīng)用就可以讓該第三方應(yīng)用訪問該用戶在某網(wǎng)站上的某些特定信息(如簡(jiǎn)單的個(gè)人信息),現(xiàn)在一般用的是OAuth 2.0(不兼容1.0).
4.2 什么是Token?
Token就是獲取信息的憑證,如上述的Access Token,讓客戶端無需用戶密碼即可獲取用戶授權(quán)的某些資源.
4.3 什么又是JWT?
JSON Web Tokens, 這是一個(gè)開放的標(biāo)準(zhǔn),規(guī)定了一種Token實(shí)現(xiàn)方式,以JSON為格式.
4.4 三者之間又是什么關(guān)系?
這三個(gè)相互連接且是由大到小的一種關(guān)系,OAuth規(guī)定授權(quán)流程,Token為其中一環(huán)的一個(gè)信息載體,具體的一種實(shí)現(xiàn)方式由JWT規(guī)定.