OAuth2 token機(jī)制研究

OAuth是一個(gè)關(guān)于授權(quán)(authorization)的開(kāi)放網(wǎng)絡(luò)標(biāo)準(zhǔn),在全世界得到廣泛應(yīng)用,目前的版本是2.0版。

OAuth的思路

OAuth在"客戶端"與"服務(wù)提供商"之間,設(shè)置了一個(gè)授權(quán)層(authorization layer)。"客戶端"不能直接登錄"服務(wù)提供商",只能登錄授權(quán)層,以此將用戶與客戶端區(qū)分開(kāi)來(lái)。"客戶端"登錄授權(quán)層所用的令牌(token),與用戶的密碼不同。用戶可以在登錄的時(shí)候,指定授權(quán)層令牌的權(quán)限范圍和有效期。
"客戶端"登錄授權(quán)層以后,"服務(wù)提供商"根據(jù)令牌的權(quán)限范圍和有效期,向"客戶端"開(kāi)放用戶儲(chǔ)存的資料。

由此有下面的拓?fù)浣Y(jié)構(gòu):(RFC 6749)


image.png

這種結(jié)構(gòu)通過(guò)授權(quán)服務(wù)器確認(rèn)客戶端用戶的合法性,然后向客戶端頒發(fā)Token,此有時(shí)間長(zhǎng)度的Token作為用戶身份的合法驗(yàn)證機(jī)制。Token的生成機(jī)制將保證Token的合法性,而不需要如基于Session的訪問(wèn)方式一樣需要資源服務(wù)器再去訪問(wèn)數(shù)據(jù)庫(kù)校驗(yàn)session的合法性。

Token Auth的優(yōu)點(diǎn)

Token機(jī)制相對(duì)于Cookie機(jī)制又有什么好處呢?

  • 支持跨域訪問(wèn): Cookie是不允許垮域訪問(wèn)的,這一點(diǎn)對(duì)Token機(jī)制是不存在的,前提是傳輸?shù)挠脩粽J(rèn)證信息通過(guò)HTTP頭傳輸.
  • 無(wú)狀態(tài)(也稱(chēng):服務(wù)端可擴(kuò)展行):Token機(jī)制在服務(wù)端不需要存儲(chǔ)session信息,因?yàn)門(mén)oken 自身包含了所有登錄用戶的信息,只需要在客戶端的cookie或本地介質(zhì)存儲(chǔ)狀態(tài)信息.
  • 更適用CDN: 可以通過(guò)內(nèi)容分發(fā)網(wǎng)絡(luò)請(qǐng)求你服務(wù)端的所有資料(如:javascript,HTML,圖片等),而你的服務(wù)端只要提供API即可.
  • 去耦: 不需要綁定到一個(gè)特定的身份驗(yàn)證方案。Token可以在任何地方生成,只要在你的API被調(diào)用的時(shí)候,你可以進(jìn)行Token生成調(diào)用即可.
    更適用于移動(dòng)應(yīng)用: 當(dāng)你的客戶端是一個(gè)原生平臺(tái)(iOS, Android,Windows 8等)時(shí),Cookie是不被支持的(你需要通過(guò)Cookie容器進(jìn)行處理),這時(shí)采用Token認(rèn)證機(jī)制就會(huì)簡(jiǎn)單得多。
  • CSRF:因?yàn)椴辉僖蕾囉贑ookie,所以你就不需要考慮對(duì)CSRF(跨站請(qǐng)求偽造)的防范。
  • 性能: 一次網(wǎng)絡(luò)往返時(shí)間(通過(guò)數(shù)據(jù)庫(kù)查詢session信息)總比做一次HMACSHA256計(jì)算 的Token驗(yàn)證和解析要費(fèi)時(shí)得多.
  • 不需要為登錄頁(yè)面做特殊處理: 如果你使用Protractor 做功能測(cè)試的時(shí)候,不再需要為登錄頁(yè)面做特殊處理.
  • 基于標(biāo)準(zhǔn)化:你的API可以采用標(biāo)準(zhǔn)化的 JSON Web Token (JWT). 這個(gè)標(biāo)準(zhǔn)已經(jīng)存在多個(gè)后端庫(kù)(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft).

基于JWT的Token認(rèn)證機(jī)制實(shí)現(xiàn)

JSON Web Token(JWT)是一個(gè)非常輕巧的規(guī)范。這個(gè)規(guī)范允許我們使用JWT在用戶和服務(wù)器之間傳遞安全可靠的信息。其

JWT的組成

一個(gè)JWT實(shí)際上就是一個(gè)字符串,它由三部分組成,頭部、載荷與簽名。
載荷(Payload)

{ "iss": "Online JWT Builder",
"iat": 1416797419,
"exp": 1448333419,
"aud": "www.example.com",
"sub": "jrocket@example.com",
"GivenName": "Johnny",
"Surname": "Rocket",
"Email": "jrocket@example.com",
"Role": [ "Manager", "Project Administrator" ]
}
iss: 該JWT的簽發(fā)者,是否使用是可選的;
sub: 該JWT所面向的用戶,是否使用是可選的;
aud: 接收該JWT的一方,是否使用是可選的;
exp(expires): 什么時(shí)候過(guò)期,這里是一個(gè)Unix時(shí)間戳,是否使用是可選的;
iat(issued at): 在什么時(shí)候簽發(fā)的(UNIX時(shí)間),是否使用是可選的;
其他還有:
nbf (Not Before):如果當(dāng)前時(shí)間在nbf里的時(shí)間之前,則Token不被接受;一般都會(huì)留一些余地,比如幾分鐘;,是否使用是可選的;
將上面的JSON對(duì)象進(jìn)行[base64編碼]可以得到下面的字符串。這個(gè)字符串我們將它稱(chēng)作JWT的Payload(載荷)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容