工作3年,還不懂單點登錄系統(tǒng)?看看這8幅漫畫~
AI全套:Python3+TensorFlow打造人臉識別智能小程序
最新人工智能資料-Google工程師親授 Tensorflow-入門到進階
黑馬頭條項目 - Java Springboot2.0(視頻、資料、代碼和講義)14天完整版
來源:blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/ 我嘗試用八幅漫畫先讓大家理解如何設計正常的用戶認證系統(tǒng),然后再延伸到單點登錄系統(tǒng)。
JWT 簡介
JSON Web Token(JWT)是一個非常輕巧的規(guī)范。這個規(guī)范允許我們使用JWT在用戶和服務器之間傳遞安全可靠的信息。
讓我們來假想一下一個場景。在A用戶關注了B用戶的時候,系統(tǒng)發(fā)郵件給B用戶,并且附有一個鏈接“點此關注A用戶”。鏈接的地址可以是這樣的 https://your.awesome-app.com/make-friend/?from_user=B&target_user=A上面的URL主要通過URL來描述這個當然這樣做有一個弊端,那就是要求用戶B用戶是一定要先登錄的??刹豢梢院喕@個流程,讓B用戶不用登錄就可以完成這個操作。JWT就允許我們做到這點。
JWT 的組成
一個JWT實際上就是一個字符串,它由三部分組成:頭部、載荷與簽名。
載荷(Payload)
我們先將上面的添加好友的操作描述成一個JSON對象。其中添加了一些其他的信息,幫助今后收到這個JWT的服務器理解這個JWT。 {"iss": "John Wu JWT","iat": 1441593502,"exp": 1441594722,"aud": "www.example.com","sub": "[email protected]","from_user": "B","target_user": "A"}這里面的前五個字段都是由JWT的標準所定義的。
iss: 該JWT的簽發(fā)者 sub: 該JWT所面向的用戶 aud: 接收該JWT的一方 exp(expires): 什么時候過期,這里是一個Unix時間戳 iat(issued at): 在什么時候簽發(fā)的
這些定義都可以在標準中找到。
將上面的JSON對象進行[base64編碼]可以得到下面的字符串。這個字符串我們將它稱作JWT的Payload(載荷)。搜索公眾號互聯(lián)網(wǎng)架構師回復“2T”,送你一份驚喜禮包。
eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9
var base64url = require('base64url')var header = { "from_user": "B", "target_user": "A"}console.log(base64url(JSON.stringify(header)))//?輸出:eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9頭部(Header)
{ "typ": "JWT", "alg": "HS256"}在這里,我們說明了這是一個JWT,并且我們所用的簽名算法(后面會提到)是HS256算法。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
簽名(簽名)
將上面的兩個編碼后的字符串都用句號.連接在一起(頭部在前),就形成了
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM
最后將這一部分簽名也拼接在被簽名的字符串后面,我們就得到了完整的JWT
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViMhttps://your.awesome-app.com/make-friend/?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM用戶認證八步走






單點登錄
Session方式來存儲用戶id,一開始用戶的Session只會存儲在一臺服務器上。對于有多個子域名的站點,每個子域名至少會對應一臺不同的服務器,例如:
www.taobao.comnv.taobao.comnz.taobao.comlogin.taobao.com
所以如果要實現(xiàn)在login.taobao.com登錄后,在其他的子域名下依然可以取到Session,這要求我們在多臺服務器上同步Session。
Set-Cookie: jwt=lll.zzz.xxx; HttpOnly; max-age=980000; domain=.taobao.com
注意domain必須設置為一個點加頂級域名,即.taobao.com。這樣,taobao.com和*.taobao.com就都可以接受到這個Cookie,并獲取JWT了。
全棧架構社區(qū)交流群
?「全棧架構社區(qū)」建立了讀者架構師交流群,大家可以添加小編微信進行加群。歡迎有想法、樂于分享的朋友們一起交流學習。
看完本文有收獲?請轉發(fā)分享給更多人
往期資源:
