??我們?cè)谑褂肁pp時(shí)异旧,一次登錄后App如果不主動(dòng)退出登錄或者清除數(shù)據(jù)弱贼,App會(huì)在很長(zhǎng)一段時(shí)間內(nèi)保持登錄狀態(tài)宣吱,或者讓用戶感覺到登錄一次就不用每次都輸入用戶密碼才能進(jìn)行登錄蓉冈。
??銀行长豁、金融涉及到支付類的App一般不支持這種長(zhǎng)時(shí)間的登錄狀態(tài)保持钧唐。對(duì)于保持長(zhǎng)期登錄的技術(shù)實(shí)現(xiàn)方式,除了和前端技術(shù)有關(guān)匠襟,還涉及到前后臺(tái)的通訊連接方式钝侠、后臺(tái)提供的服務(wù)方式等有關(guān)。比如前端App是前端技術(shù)是原生加H5實(shí)現(xiàn)的酸舍,那選擇的技術(shù)可能和純?cè)牟灰粯铀汀_€有如果后端使用了sso(單點(diǎn)登錄方式)技術(shù)那就和后端使用了webservice、Socket的方式不一樣啃勉,具體實(shí)現(xiàn)上有時(shí)候需要綜合考慮忽舟。總結(jié)出來一般的登錄保持功能有如下的實(shí)現(xiàn)方式:
一淮阐、利用Cookie機(jī)制實(shí)現(xiàn)
??我們知道cookie是為了解決http無狀態(tài)的一種技術(shù)叮阅,被電商、oa等web應(yīng)用廣泛使用泣特。如果我們的App和后端通訊采用的http通訊方式帘饶,可以利用cookie技術(shù)進(jìn)行登錄狀態(tài)保持。比如我們可以把sessionID和有效期保存在cookie中群扶,發(fā)給前端App及刻,前端App收到后保存在本地镀裤。當(dāng)訪問后端服務(wù)把sessionID和有效期作為參數(shù)傳給后臺(tái)進(jìn)行認(rèn)證。直到sessionID失效缴饭,用戶都不需要重新登錄暑劝。
二、用戶名和密碼
??如果App和后端通信不是通過http協(xié)議進(jìn)行的颗搂,那cookie機(jī)制可能就不太適合担猛。利用用戶名和密碼保持登錄是指用戶在第一次登錄成功時(shí),把用戶名和密碼保存的本地丢氢,下次用戶打開App時(shí)登錄利用保存的用戶名和密碼在后臺(tái)自動(dòng)完成傅联。這種方式需要考慮用戶名和密碼的安全問題,防止信息被破解疚察。
三蒸走、token方式
??token方式在app認(rèn)證上用的比較普遍,App初始登錄時(shí)貌嫡,提交賬號(hào)和密碼數(shù)據(jù)給服務(wù)端比驻,服務(wù)端根據(jù)定義的的策略生成一個(gè)token字符串,token字符串中可以包含用戶信息岛抄、設(shè)備ID等信息以保證用戶的唯一性别惦。服務(wù)端并對(duì)token設(shè)置一定的期限。服務(wù)端把生成的token字符串傳給客戶端夫椭,客戶端保存token字符串,并在接下來的請(qǐng)求中帶上這個(gè)字符串蹭秋。相對(duì)于在App本地token的安全性更高了。
App登錄狀態(tài)保持除了實(shí)現(xiàn)路徑外還需要考慮服務(wù)端數(shù)據(jù)持久化問題感凤、客戶端防拷貝問題、攔截破解問題等陪竿,在使用中需要綜合考慮禽翼。
四、密鑰方式
??以上三種方法族跛,要么不能持久保存狀態(tài)闰挡,要么不安全礁哄,要么每次請(qǐng)求都需要讀取數(shù)據(jù)庫驗(yàn)證,有沒有一種方法桐绒,能解決以上的缺陷呢夺脾,于是之拨,就有了這個(gè)方法,流程如下:
1:客戶端輸入用戶名和密碼咧叭,提交到服務(wù)端驗(yàn)證
2:服務(wù)端驗(yàn)證成功后蚀乔,給客戶端返回以下值:
uid : 用戶的唯一標(biāo)示
time : 當(dāng)前unix時(shí)間戳
key : MD5(uid+time+"一個(gè)只有你自己知道的字符串密鑰")
3:客戶端保存以上3個(gè)值在本地菲茬,每次HTTP請(qǐng)求時(shí),將以上3個(gè)值發(fā)送到服務(wù)端
4:服務(wù)端驗(yàn)證key婉弹,判斷如果與客戶端發(fā)送的key一致,則說明用戶身份無誤
5:服務(wù)端每次收到請(qǐng)求時(shí)镀赌,通過當(dāng)前時(shí)間-客戶端time字段得到的差值,可以控制這個(gè)key的有效期