APP登錄自動登錄—token

調(diào)用后端接口怎么樣才安全?

在APP中保存登錄數(shù)據(jù),每次調(diào)用接口時傳輸

程序員總能給自己找到偷懶的方法,有的程序為了省事,會在用戶登錄后,直接把用戶名和密碼保存在本地,然后每次調(diào)用后端接口時作為參數(shù)傳遞。真省事兒啊!可這種方法簡單就像拿著一袋子錢在路上邊走邊喊“快來搶我呀!快來搶我呀!”,一個小小的嗅探器就能把用戶的密碼拿到手,如果用戶習(xí)慣在所有地方用一個密碼,那么你闖大禍了,黑客通過撞庫的方法能把用戶的所有信息一鍋端。

登錄時請求一次token,之后用token調(diào)用接口

這是比較安全的方式,用戶在登錄時,APP調(diào)用獲取token的接口(比如 http://api.abc.com/get_token/),用post將用戶名和密碼的摘要傳遞給服務(wù)器,然后服務(wù)器比對數(shù)據(jù)庫中的用戶信息,匹配則返回綁定該用戶的token(這一般翻譯為令牌,很直觀的名字,一看就知道是有了這玩意,就會對你放行),而數(shù)據(jù)庫中,在用戶的token表中也同時插入了這個token相關(guān)的數(shù)據(jù):這個token屬于誰?這個token的有效期是多久?這個token當(dāng)前登錄的ip地址是?這個token對應(yīng)的deviceid是?……
這樣即便token被有心人截獲,也不會造成太大的安全風(fēng)險。因為沒有用戶名和密碼,然后如果黑客通過這個token偽造用戶請求,我們在服務(wù)器端接口被調(diào)用時就可以對發(fā)起請求的ip地址、user-agent之類的信息作比對,以防止偽造。再然后,如果token的有效期設(shè)得小,過一會兒它就過期了,除非黑客可以持續(xù)截獲你的token,否則他只能干瞪眼。(插一句題外話:看到這里,是不是明白為什么不推薦在外面隨便接入來歷不明的wifi熱點了?)

tips:token如何生成? 可以根據(jù)用戶的信息及一些隨機(jī)信息(比如時間戳)再通過hash編碼(比如
md5、sha1等)生成唯一的編碼。
tips:token的安全級別,取決于你的實際需求,所以如果不是涉及財產(chǎn)安全的領(lǐng)域,并不建議太嚴(yán)格
(比如用戶走著走著,3G換了個基站,閃斷了一下IP地址變了,尼瑪token過期了,這就屬于為了不必要
的安全丟了用戶體驗,當(dāng)然如果變換的IP地址跨省的話還是應(yīng)該驗證一下的,想想QQ有時候會讓填驗證碼
就明白了)。
tips:接口在返回信息時,可以包含本次請求的狀態(tài),比如成功調(diào)用,那么result['status']可能就
是'success',而反之則是'error',而如果是'error',則result['errcode']中就可以包含錯誤
的原因,比如errcode中是'invalid_token'就可以告訴APP這個token過期或無效,這時APP應(yīng)彈出
登錄框或者用本地存儲的用戶名或密碼再次請求token(用戶選擇“記住密碼”,就應(yīng)該在本地保存用戶名
和密碼的摘要,方法見plus.storage的文檔)。

更安全一點,獲取token通過SSL

剛才的方法,機(jī)智一點兒的讀者大概會心存疑慮:那獲取token時不還是得明文傳輸一次密碼嗎?
是的,你可以將這個獲取token的地址,用SSL來保護(hù)( 比如https://api.abc.com/get_token/ ),這樣黑客即使截了包,一時半會兒也解不出什么信息。
SSL證書的獲取渠道很多,我相信你總有辦法查到,所以不廢話了。不過話說namecheap上的SSL證書比godaddy的要便宜得多……(這是吐槽)

tips:前段時間OpenSSL漏洞讓很多服務(wù)器遭殃,所以如果自己搭服務(wù)器,一定記得裝補(bǔ)丁。
tips:可以把所有接口都弄成SSL的嗎?可以。但會拖慢服務(wù)器,如果是配置并不自信的VPS,建議不折騰。

還要更更安全(這標(biāo)題真省事)

還記得剛才APP向服務(wù)器請求token時,可以加入的用戶信息嗎?比如用戶的設(shè)備deviceid。
如果我們在調(diào)用接口時,還附帶一個當(dāng)前時間戳參數(shù)timestamp,同時,用deviceid和這個時間戳再生成一個參數(shù)sign,比如 md5(deviceid timestamp token)這樣的形式。而服務(wù)端首先驗證一下參數(shù)中的時間戳與當(dāng)前服務(wù)器時間是否一致(誤差保持在合理范圍內(nèi)即可,比如5分鐘),然后根據(jù)用戶保存在服務(wù)器中的deviceid來對參數(shù)中的時間戳進(jìn)行相同的變形,驗證是否匹配,那便自然“更更安全”了。

tips:如果對整個調(diào)用請求中的參數(shù)進(jìn)行排序,再以deviceid和timestamp加上排序后的參數(shù)來對整個調(diào)用生成1個sign,黑客即使截獲sign,不同的時間點、參數(shù)請求所使用的sign也是不同的,難以偽造,自然會更安全。當(dāng)然,寫起來也更費事。

tips:明白了原理,整個驗證過程是可以根據(jù)自己的需求改造的。

參考文檔:
設(shè)計基于HTML5的APP登錄功能及安全調(diào)用接口的方式(原理篇)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容