-
1 # 想早睡的臭小子
-
2 # 會點程式碼的大叔
Token
Token是服務端生成的一串字串,可以看做客戶端進行請求的一個令牌,客戶端在請求網路上某些資源的時候,必須帶著這塊令牌(通行證)。
當客戶端第一次訪問服務端,服務端會根據傳過來的唯一標識userId,運用一些加密演算法,生成一個Token,客戶端下次請求時,只需要帶上Token,伺服器收到請求後,會驗證這個Token。
有些公司會建設統一登入系統(單點登入),客戶端先去這個系統獲取Token,驗證通過再拿著這些Token去訪問其他系統;API Gateway也可以提供類似的功能,我們公司就是這樣,客戶端接入的時候,先向閘道器獲取Token,驗證通過了才能訪問被授權的介面,並且一段時間後要重新或者Token。
基於Token的認證流程客戶端使用使用者名稱、密碼做身份驗證;
服務端收到請求後進行身份驗證;(也可能是統一登入平臺、閘道器)
驗證成功後,服務端會簽發一個Token返回給客戶端;
客戶端收到Token以後可以把它儲存起來;每次向服務端傳送請求的時候,都要帶著Token;
Token會有過期時間,過期後需要重新進行驗證;
服務端收到請求,會驗證客戶端請求裡面的Token,驗證成功,才會響應客戶端的請求;
Token過期時間及超時重新整理策略因為Token是訪問資源的憑證,所以必須要有過期時間。否則一次認證通過就可以永久使用資源,那麼認證功能也就失去了意義,所以Token需要有過期時間。
Token的過期時間很容易甚至,在生成Token的元素中,增加時間戳即可;然後在驗證過程中,判斷是否超時;Token的超時時間不宜過長,也不宜過短,我們專案設定的是1個小時。
Token過期之後,需要重新獲取,一種方式是重新來一遍獲取Token的過程(比如重新登入),這種做法實現起來簡單,但是使用者體驗不好;另外一種主動重新整理Token,在過期後自動續約,或者定時任務定期去重新整理Token,以保持Token始終在有效期內;我們現在採用被動的方式獲取和更新Token。
-
3 # 三十多歲的小周
Token驗證流程:
1.背景介紹
傳統身份驗證的方法
HTTP是一種沒有狀態的協議,也就是它並不知道是誰是訪問應用。這裡我們把使用者看成是客戶端,客戶端使用使用者名稱還有密碼通過了身份驗證,不過下回這個客戶端再發送請求時候,還得再驗證一下。
解決的方法就是,當用戶請求登入的時候,如果沒有問題,我們在服務端生成一條記錄,這個記錄裡可以說明一下登入的使用者是誰,然後把這條記錄的ID號傳送給客戶端,客戶端收到以後把這個ID號儲存在Cookie裡,下次這個使用者再向服務端傳送請求的時候,可以帶著這個Cookie,這樣服務端會驗證一個這個Cookie裡的資訊,看看能不能在服務端這裡找到對應的記錄,如果可以,說明使用者已經通過了身份驗證,就把使用者請求的資料返回給客戶端。
上面說的就是Session,我們需要在服務端儲存為登入的使用者生成的Session,這些Session可能會儲存在記憶體,磁碟,或者資料庫裡。我們可能需要在服務端定期的去清理過期的Session。
基於Token的身份驗證方法
使用基於Token的身份驗證方法,在服務端不需要儲存使用者的登入記錄。大概的流程是這樣的:
客戶端使用使用者名稱跟密碼請求登入
服務端收到請求,去驗證使用者名稱與密碼
驗證成功後,服務端會簽發一個Token,再把這個Token傳送給客戶端
客戶端收到Token以後可以把它儲存起來,比如放在Cookie裡或者LocalStorage裡
客戶端每次向服務端請求資源的時候需要帶著服務端簽發的Token
服務端收到請求,然後去驗證客戶端請求裡面帶著的Token,如果驗證成功,就向客戶端返回請求的資料
傳統身份驗證的方法
HTTP是一種沒有狀態的協議,也就是它並不知道是誰是訪問應用。這裡我們把使用者看成是客戶端,客戶端使用使用者名稱還有密碼通過了身份驗證,不過下回這個客戶端再發送請求時候,還得再驗證一下。
解決的方法就是,當用戶請求登入的時候,如果沒有問題,我們在服務端生成一條記錄,這個記錄裡可以說明一下登入的使用者是誰,然後把這條記錄的ID號傳送給客戶端,客戶端收到以後把這個ID號儲存在Cookie裡,下次這個使用者再向服務端傳送請求的時候,可以帶著這個Cookie,這樣服務端會驗證一個這個Cookie裡的資訊,看看能不能在服務端這裡找到對應的記錄,如果可以,說明使用者已經通過了身份驗證,就把使用者請求的資料返回給客戶端。
上面說的就是Session,我們需要在服務端儲存為登入的使用者生成的Session,這些Session可能會儲存在記憶體,磁碟,或者資料庫裡。我們可能需要在服務端定期的去清理過期的Session。
基於Token的身份驗證方法
使用基於Token的身份驗證方法,在服務端不需要儲存使用者的登入記錄。大概的流程是這樣的:
客戶端使用使用者名稱跟密碼請求登入
服務端收到請求,去驗證使用者名稱與密碼
驗證成功後,服務端會簽發一個Token,再把這個Token傳送給客戶端
客戶端收到Token以後可以把它儲存起來,比如放在Cookie裡或者LocalStorage裡
客戶端每次向服務端請求資源的時候需要帶著服務端簽發的Token
服務端收到請求,然後去驗證客戶端請求裡面帶著的Token,如果驗證成功,就向客戶端返回請求的資料Tiles起源
最早的Tiles是組裝在Struts1.1裡面的,主要目的是為了將複數的jsp頁面作為一個的頁面的部分機能,然後用來組合成一個最終表示用頁面用的,這樣的話,便於對頁面的各個機能的變更及維護。
現在Tiles已經作為一個Apache獨立的開源專案維護著。
如果您發現自己在每個頁面上都要編寫三行相同的JSP程式碼,或者你想容易地定義複雜的模版佈局,那麼相信學習Tiles框架會對你有幫助
2.知識剖析
傳統身份驗證的方法
HTTP是一種沒有狀態的協議,也就是它並不知道是誰是訪問應用。這裡我們把使用者看成是客戶端,客戶端使用使用者名稱還有密碼通過了身份驗證,不過下回這個客戶端再發送請求時候,還得再驗證一下。
解決的方法就是,當用戶請求登入的時候,如果沒有問題,我們在服務端生成一條記錄,這個記錄裡可以說明一下登入的使用者是誰,然後把這條記錄的ID號傳送給客戶端,客戶端收到以後把這個ID號儲存在Cookie裡,下次這個使用者再向服務端傳送請求的時候,可以帶著這個Cookie,這樣服務端會驗證一個這個Cookie裡的資訊,看看能不能在服務端這裡找到對應的記錄,如果可以,說明使用者已經通過了身份驗證,就把使用者請求的資料返回給客戶端。
上面說的就是Session,我們需要在服務端儲存為登入的使用者生成的Session,這些Session可能會儲存在記憶體,磁碟,或者資料庫裡。我們可能需要在服務端定期的去清理過期的Session。
基於Token的身份驗證方法
使用基於Token的身份驗證方法,在服務端不需要儲存使用者的登入記錄。大概的流程是這樣的:
客戶端使用使用者名稱跟密碼請求登入
服務端收到請求,去驗證使用者名稱與密碼
驗證成功後,服務端會簽發一個Token,再把這個Token傳送給客戶端
客戶端收到Token以後可以把它儲存起來,比如放在Cookie裡或者LocalStorage裡
客戶端每次向服務端請求資源的時候需要帶著服務端簽發的Token
服務端收到請求,然後去驗證客戶端請求裡面帶著的Token,如果驗證成功,就向客戶端返回請求的資料
傳統身份驗證的方法
HTTP是一種沒有狀態的協議,也就是它並不知道是誰是訪問應用。這裡我們把使用者看成是客戶端,客戶端使用使用者名稱還有密碼通過了身份驗證,不過下回這個客戶端再發送請求時候,還得再驗證一下。
解決的方法就是,當用戶請求登入的時候,如果沒有問題,我們在服務端生成一條記錄,這個記錄裡可以說明一下登入的使用者是誰,然後把這條記錄的ID號傳送給客戶端,客戶端收到以後把這個ID號儲存在Cookie裡,下次這個使用者再向服務端傳送請求的時候,可以帶著這個Cookie,這樣服務端會驗證一個這個Cookie裡的資訊,看看能不能在服務端這裡找到對應的記錄,如果可以,說明使用者已經通過了身份驗證,就把使用者請求的資料返回給客戶端。
上面說的就是Session,我們需要在服務端儲存為登入的使用者生成的Session,這些Session可能會儲存在記憶體,磁碟,或者資料庫裡。我們可能需要在服務端定期的去清理過期的Session。
基於Token的身份驗證方法
使用基於Token的身份驗證方法,在服務端不需要儲存使用者的登入記錄。大概的流程是這樣的:
客戶端使用使用者名稱跟密碼請求登入
服務端收到請求,去驗證使用者名稱與密碼
驗證成功後,服務端會簽發一個Token,再把這個Token傳送給客戶端
客戶端收到Token以後可以把它儲存起來,比如放在Cookie裡或者LocalStorage裡
客戶端每次向服務端請求資源的時候需要帶著服務端簽發的Token
服務端收到請求,然後去驗證客戶端請求裡面帶著的Token,如果驗證成功,就向客戶端返回請求的資料
3.常見問題
基於伺服器驗證方式暴露的一些問題
1.Seesion:每次認證使用者發起請求時,伺服器需要去建立一個記錄來儲存資訊。當越來越多的使用者發請求時,記憶體的開銷也會不斷增加。
2.可擴充套件性:在服務端的記憶體中使用Seesion儲存登入資訊,伴隨而來的是可擴充套件性問題。
3.CORS(跨域資源共享):當我們需要讓資料跨多臺移動裝置上使用時,跨域資源的共享會是一個讓人頭疼的問題。在使用Ajax抓取另一個域的資源,就可以會出現禁止請求的情況。
4.CSRF(跨站請求偽造):使用者在訪問銀行網站時,他們很容易受到跨站請求偽造的攻擊,並且能夠被利用其訪問其他的網站。在這些問題中,可擴充套件行是最突出的。因此我們有必要去尋求一種更有行之有效的方法。
4.解決方案
基於Token的身份驗證的過程如下:
1.使用者通過使用者名稱和密碼傳送請求。
2.程式驗證。
3.程式返回一個簽名的token給客戶端。
4.客戶端儲存token,並且每次用於每次傳送請求。
5.服務端驗證token並返回資料。
token有一定的時效,過期之後需要重新向登陸認證,拿到新的token;
移動客戶端向伺服器登陸時,需要提供包含token的認證,伺服器需要向渠道認證包含token的認證資訊,如果渠道返回有效,則認為移動客戶端為合法;
過程中經常會斷線重連,每次重連過程相當於走一次向伺服器登入的過程,伺服器也會將token向渠道伺服器進行了認證,但是token的時效性,導致一段時間之後的斷線重連會被拒絕;
一種解決方案是:每次斷線重連的時候,先向伺服器登陸,申請新的token;另一種是:當伺服器得到的反饋是token已經過期,那麼告知客戶端重新向渠道伺服器獲取,然後帶著新的token進行斷線重連操作。相對於可能頻繁的獲取token,更趨向於第二種方法,從經驗來看,大部分token的時效是按照小時來計算的
-
4 # 網路圈
Token機制雖說很早就出現了,但也就是最近十年內才廣泛應用的,而很多新手對於Token和Session何時使用區分不了,雖說聽說過Token但不知道其原理是啥以及如何使用。
Token是為了解決什麼問題而生的?在Token機制之前,伺服器端驗證客戶端請求是否合法主要是靠Cookie+Session機制來實現的。伺服器端會為每個會話都生成一個Session,在高併發場景下會導致Session檔案越來越多,不利於管理。
而Token是伺服器端生成的一串加密字串(具有生命週期),分配給客戶端作為令牌使用,Token的好處就是減輕了伺服器端的壓力,因為Token是由客戶端儲存的,而且是無狀態的。
Token超時問題如何解決?伺服器端生成的Token是有生命週期的(過期時間),如果我們拿著已過期的Token去伺服器端驗證肯定是無法通過的,所以我們要在Token過期之前主動更新Token,方案如下:
1、客戶端儲存Token時要記錄Token的過期時間
客戶端拿到伺服器生成返回的Token後,需要將Token臨時儲存起來(SessionStorage、LocalStorage),然後客戶端定時檢測Token是否已過期,如果過期了則主動向授權伺服器重新發起認證請求。
2、由伺服器端主動通知客戶端進行Token更新
客戶端每次的請求中都會帶上Token,伺服器會對此Token進行校驗,如果伺服器端發現此Token將會在很短時間內失敗,那就重新生成Token並附加到響應體中,客戶端獲取伺服器響應資料時看下是否有Token,如果有則覆蓋本地舊的Token即可。
回覆列表
首先你要明白token最初的設計思路和目的,並不是很多人所謂的用redis儲存什麼東西,那樣只是session共享的一種方式,token實際上是一串字串,這個字串是將登入資訊用特定手段進行加密之後,由客戶端儲存,並在每次請求中攜帶,用於驗證身份的一個令牌機制,也就是說這個字串本身就包含登入的資訊,並不需要其他的redis之類的機制來儲存其他資訊,也就是說他是無狀態的,有效性的判定標準由後端的特定邏輯來確定的,而token在第一次登入之後,由後端計算完成,併發送至客戶端並存儲,對於客戶端來說,之後的每次路由跳轉,網路請求,都需要攜帶這個token,用來告訴路由守衛也好,服務提供者也好,我當前是誰在操作,這個操作是不是被允許,僅此而已,如果需要當前登入使用者的詳細資訊,可以在登陸的時候存到類似vuex等狀態保持機制中去,隨用隨取,所以這種機制下,redis完全沒有用處。