標籤:
首先Token是一個怎麼樣的東西,Token存在的意義又在哪裡?學過php或是其他web開發的人都知道一個東西叫session和cookie,這些東西可以在伺服器或是本地儲存一些東西,比如說登入狀態,當使用者登入後可以通過session或是cookie在本地儲存一段時間的登入狀態,在這段時間內,使用者再度登入的時候就不用再輸入使用者名稱和密碼了,但是過了一段時間後,使用者需要再次進行身份認證,這樣一來的話,一方面節省了很多操作的步驟提升了操作體驗,同時也節省了很多伺服器請求,提高了伺服器效能,同時也保證了一定的安全性。
那麼這個功能如何在android中實現呢?很可惜的是在android中並沒有直接提供類似session或cookie的東西,這個時候就是通過Token來完成。Token的存在更像是一個令牌,比如說當我們需要實現具有使用者權限的操作時,每一次操作都需要向伺服器發送請求,讓伺服器完成在資料庫中進行使用者名稱和密碼,這些顯然對於伺服器的效能是很不利的。當然有人也會說我們可以在一次請求成功後將類似於user_id的東西儲存在本地,以後每次請求的時候用user_id進行操作,這樣不是就降低了伺服器的負擔,但是這樣的話存在一個問題,就是user_id一旦儲存在本地的時候,不是太有可能會自動回收掉,這樣一來的話就會導致一個問題,就是app無論何時開啟都是驗證通過的狀態,這樣一來安全性降低。而Token就是解決這樣一個問題的東西:
Token的定義:Token是服務端產生的一串字串,以作用戶端進行請求的一個令牌,當第一次登入後,伺服器產生一個Token便將此Token返回給用戶端,以後用戶端只需帶上這個Token前來請求資料即可,無需再次帶上使用者名稱和密碼。
瞭解了Token的意義後,我們就更明確的知道為什麼要用他了。
1、用裝置號/裝置mac地址作為Token(推薦)
用戶端:用戶端在登入的時候擷取裝置的裝置號/mac地址,並將其作為參數傳遞到服務端。
服務端:服務端接收到該參數後,便用一個變數來接收同時將其作為Token儲存在資料庫,並將該Token設定到session中,用戶端每次請求的時候都要統一攔截,並將用戶端傳遞的token和伺服器端session中的token進行對比,如果相同則允許存取,不同則拒絕。
分析:此刻用戶端和伺服器端就統一了一個唯一的標識Token,而且保證了每一個裝置擁有了一個唯一的會話。該方法的缺點是用戶端需要帶裝置號/mac地址作為參數傳遞,而且伺服器端還需要儲存;優點是用戶端不需重新登入,只要登入一次以後一直可以使用,至於逾時的問題是有伺服器這邊來處理,如何處理?若伺服器的Token逾時後,伺服器只需將用戶端傳遞的Token向資料庫中查詢,同時並賦值給變數Token,如此,Token的逾時又重新計時。
2、用session值作為Token
用戶端:用戶端只需攜帶使用者名稱和密碼登陸即可。
用戶端:用戶端接收到使用者名稱和密碼後並判斷,如果正確了就將本地擷取sessionID作為Token返回給用戶端,用戶端以後只需帶上請求資料即可。
分析:這種方式使用的好處是方便,不用儲存資料,但是缺點就是當session到期後,用戶端必須重新登入才能進行訪問資料。
Token在android中的使用