發布時間:2023-05-12 18:22:53
App 調用登錄接口返回用戶的token信息,token信息存儲在本地,以后每個接口都發送token,如果服務器驗證token失效,一般客戶端都會怎么處理?跳入登錄頁面讓用戶登錄?還有沒有其他的處理方式?可不可以手動刷新token再重新請求?這枯祥攜樣是不是token失效就變得沒有意義了?如果token泄沒伏露了會造成哪些后果?
我現在碰見的問題是需要手動更新token,但是由于我的請求類是一個公用類,如果在請求中判斷token失效就需要刷新token,這樣第一個的請求數據就沒了,如果建立一個公用類存儲,但發生多個異步請求的時候,只有一個請求的數據可以保留下來,有沒宴斗有什么比較好的解決方案?
連接各行各業的平臺載體。
token錢包已經遠遠超過了一般數字貨幣鏈察沒錢包功能。
它不僅僅是一款存儲數字貨幣的普通錢包,而是沒唯真正的去中心化的棚納區塊鏈鏈上錢包;
它的功能也不僅僅只存儲數字貨幣。
安全
在app開放接口api的設計中,避免不了的就是安全性問題,因為大多數接口涉及到用戶的個人信息以及一些敏感的數據,所以對這些接口需要進行身份的認證,那么這就需要用戶提供一些信息,比如用戶名密碼等,但是為了安全起見讓用戶暴露的明文密碼次數越少越好,我們一般在web項目中,大多數采用保存的session中,然后在存一份到cookie中,來保持用戶的回話有效性。但是在app提供的開放接口中,后端服務器在用戶登錄后如何去驗證和維護用虧燃戶的登陸有效性呢,以下是參考項目中設計的解決方案,其原理和大多數開放接口安全驗證一樣,如淘寶的開放接口token驗證,微信開發平臺token驗證都是同理。
簽名設計
對于敏感喚空伏的api接口,需使用https協議
https是在http超文本傳輸協議加入SSL層,它在網絡間通信是加密的,所以需要加密證書。
https協議需要ca證書,一般需要交費。
原理:用戶登錄后向服務器提供用戶認證信息(如賬戶和密碼),服務器認證完后給客戶端返回一個Token令牌,用戶再次獲取信息時,帶上此令牌,如果令牌正取,則返回數據。對于獲取Token信息后,訪問用戶相關接口,客戶端請求的url需要帶上如下參數:
時間戳:timestamp
Token令牌:token
然后將所有用戶請求的參數按照字母排序(包括timestamp,token),然后根據MD5加密(可以加點鹽),全部大寫,生成sign簽名,這就是所說的url簽名算法。然后登陸后每次調用用戶信息時,帶上sign,timestamp,token參數。
api請求客戶端想服務器端一次發送用用戶認證信息(用戶名和密碼),服務器端請求到改請求后,驗證用戶信息是否正確。
如果正確:則返回一個唯一不重復的字符串(一般為UUID),然后在Redis(任意緩存服務器)中維護Token—-Uid的用戶信息關系,以便其他api對token的校驗。如果錯誤:則返回錯誤碼。
2.服務器設計一個url請求攔截規則
(1)判斷是否包含timestamp,token,sign參數,如果不含有返回錯誤碼。
(2)判斷服務器接到請求的時間和參數中的時間戳是否相差很長一段時間(時間自定義如半個小時),如果超過和攜則說明該url已經過期(如果url被盜,他改變了時間戳,但是會導致sign簽名不相等)。
(3)判斷token是否有效,根據請求過來的token,查詢redis緩存中的uid,如果獲取不到這說明該token已過期。
(4)根據用戶請求的url參數,服務器端按照同樣的規則生成sign簽名,對比簽名看是否相等,相等則放行。(自然url簽名也無法100%保證其安全,也可以通過公鑰AES對數據和url加密,但這樣如果無法確保公鑰丟失,所以簽名只是很大程度上保證安全)。
(5)此url攔截只需對獲取身份認證的url放行(如登陸url),剩余所有的url都需攔截。
3.Token和Uid關系維護
對于用戶登錄我們需要創建token–uid的關系,用戶退出時需要需刪除token–uid的關系
你對 TOKEN 和 SESSION 的理解有誤。
SESSION 是服務器通過 Key-Value 對來保存數據的一種機制,比如 APP 的登錄狀態清睜可以用 SESSION 來保存。
TOKEN 翻譯過來叫令牌,令牌是什么意思?可以拿現實中的令牌對比,現實中的令牌起到通行證的作用,而這在服務端也是一樣的。我們在登錄后,服務端使用 SESSION 保存我們的登錄狀態,并把 SESSION 的 Key 返回給客戶端,那么這個 Key 就成為我們的令森螞牌(TOKEN),我們以后再訪問數據,就此正埋直接把這個 TOKEN 隨著請求一起發送給服務端,這樣服務端通過這個 TOKEN 在 SESSION 中查找數據,如果有就說明 TOKEN 有效(就像你去旅游,關口認可你的通行證),并取出你的登錄數據,利用你的用戶信息(保存在登錄數據內)查出你想要的內容。
實際上 TOKEN 的校驗會更復雜,上面只是給出一個簡單的例子方便理解。
session在會話機制,app進程被結束掉或者長時間不使用是不能繼續的會話的交換數據的;
而token是旅雀碧由賬號密碼換取而來的,存在app本地,keychain等位置。就算會話拆舉歲衡結束,下次啟動app也照樣不用登錄賬號密碼