首先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過期后,客戶端必須重新登錄才能進行訪問數據。
不是悶騷的程序員算不上程序員。我的微信公眾號“那點鼻事”,在這里周一到周五每天一篇文章,與技術無關,只哈牛逼。