摘要:在實(shí)現(xiàn)過(guò)程中也找到了不少的好資料,這一篇中用戶驗(yàn)證方案詳細(xì)的介紹了用戶驗(yàn)證的不同方案。另,的失效時(shí)間應(yīng)該設(shè)置多長(zhǎng)需要根據(jù)所在項(xiàng)目的實(shí)際情況確定。
移動(dòng)開(kāi)發(fā)中一定會(huì)涉及后臺(tái)API如何訪問(wèn),如何控制訪問(wèn)權(quán)限,保證系統(tǒng)安全等問(wèn)題。
介紹一下我最近自己做的一個(gè)移動(dòng)端訪問(wèn)后端API的例子,例子寫(xiě)的很粗糙,但是基本實(shí)現(xiàn)了以token auth 為核心的demo。
在實(shí)現(xiàn)demo過(guò)程中也找到了不少的好資料,這一篇《APP中用戶驗(yàn)證方案》詳細(xì)的介紹了APP用戶驗(yàn)證的不同方案。
大體思路:
APP登錄界面輸入用戶信息登錄;服務(wù)端驗(yàn)證登錄信息,驗(yàn)證成功,向APP端發(fā)送token,將token保存到數(shù)據(jù)庫(kù)或者緩存服務(wù)器中;APP登錄成功后,每次調(diào)用后端API時(shí)都需要帶著token、時(shí)間戳、sign(token+時(shí)間戳的md5字符串,sign可以自己定義算法以防止被盜用)信息,以便后臺(tái)驗(yàn)證訪問(wèn)API權(quán)限;后端在接收到APP訪問(wèn)請(qǐng)求時(shí),比對(duì)APP發(fā)送來(lái)的token與緩存服務(wù)器中已經(jīng)存在的token是否一致,并驗(yàn)證token時(shí)效性。
好了,廢話少說(shuō),上代碼:
前端代碼(APP,最近寫(xiě)的APP基本都是H5方式實(shí)現(xiàn)):
這里的ostData使用的是封裝好的Ajax函數(shù),下面一并放出代碼:
ajax.js:
/*對(duì)ajax進(jìn)行簡(jiǎn)易封裝,便于每次調(diào)用,省去參數(shù)設(shè)置*/ function postData(url, data, headData, callback, waitingDialog) { mui.ajax(url,{ data:data, dataType:"json", type:"post", headers: { "token" : headData[0], "timesamp" : headData[1], "sign" : headData[2] }, contentType:"application/x-www-form-urlencoded; charset=utf-8", timeout:20000, success:callback, error:function(xhr,type,errorThrown){ //waitingDialog.close(); alert("<網(wǎng)絡(luò)連接失敗,請(qǐng)重新嘗試一下>", "錯(cuò)誤", "OK", null); } }); }
ajax中加上了headers參數(shù),這里加headers參數(shù)的目的是,后臺(tái)使用servlet+filter的方式控制訪問(wèn),如果將token等其他參數(shù)直接和表單數(shù)據(jù)同時(shí)提交,filter在獲取token信息后,servlet就不能獲取到表單數(shù)據(jù),這就比較尷尬了,或者后臺(tái)使用AOP的方式控制訪問(wèn)權(quán)限 ,這個(gè)還沒(méi)有來(lái)得及嘗試。如果我能把token信息加到于表單數(shù)據(jù)不同的存儲(chǔ)區(qū)域就好了,Google后找到了可以把數(shù)據(jù)加到請(qǐng)求的header中可以實(shí)現(xiàn)將token數(shù)據(jù)與表單數(shù)據(jù)分離的效果。
過(guò)濾器(Java實(shí)現(xiàn) JDK1.8 Tomcat8.5.6):
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import me.wlc.wx.web.tool.Md5; /** * 使用注解標(biāo)注過(guò)濾器 * @WebFilter將一個(gè)實(shí)現(xiàn)了javax.servlet.Filte接口的類定義為過(guò)濾器 * 屬性filterName聲明過(guò)濾器的名稱,可選 * 屬性u(píng)rlPatterns指定要過(guò)濾 的URL模式,也可使用屬性value來(lái)聲明.(指定要過(guò)濾的URL模式是必選屬性) * urlPatterns="/*" 表示過(guò)濾掉所有請(qǐng)求 */ @WebFilter(filterName="AccessFilter",urlPatterns="/*") public class AccessFilter implements Filter { @Override public void destroy() { System.out.println("過(guò)濾器銷毀"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("執(zhí)行過(guò)濾操作"); HttpServletRequest req = (HttpServletRequest) request; String uri = req.getRequestURI(); System.out.println("uri is : " + uri); //對(duì)請(qǐng)求的uri(即api)進(jìn)行判斷,如果是登錄的uri則直接放行,如果是其他api則對(duì)sign進(jìn)行驗(yàn)證操作 if( !uri.endsWith("loginServlet") ){ //從請(qǐng)求的url中取出token、時(shí)間戳、sign String token = req.getHeader("token"); String timesamp = req.getHeader("timesamp"); String sign = req.getHeader("sign"); System.out.println("sign is : " + sign); StringBuffer requestUrl = req.getRequestURL(); System.out.println("請(qǐng)求的Url是: " + requestUrl); //對(duì)token、timesamp 進(jìn)行md5計(jì)算 String signMd5 = Md5.getMD5(token + timesamp); if(sign.equals(signMd5)){ //簽名通過(guò) chain.doFilter(request, response); }else{ //簽名不通過(guò),向app后端發(fā)送錯(cuò)誤信息,提示重新登錄 } }else{ //登錄操作 chain.doFilter(request, response); } //請(qǐng)求通過(guò) //chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("過(guò)濾器初始化"); } }
后端還沒(méi)有實(shí)現(xiàn)驗(yàn)證token時(shí)效性功能,也沒(méi)有將token存儲(chǔ)到緩存服務(wù)器中,這些需要具體方案定下來(lái)以后再加上了。再說(shuō)一句,生成的token保證token值唯一即可,可以使用最方便的UUID(Java中)。
大體就是這樣了,有問(wèn)題隨時(shí)提給我哦!
PS:2018年9月28日更新
一直沒(méi)有登錄查看留言,給留言板的各位兄弟道個(gè)歉,沒(méi)有及時(shí)回復(fù)
token存儲(chǔ)方案:
方案一:使用session的超時(shí)時(shí)間來(lái)控制token的失效時(shí)間
方案二:使用redis存儲(chǔ)token的失效時(shí)間
方案一適用于單機(jī)環(huán)境,可以作為小型系統(tǒng)的token時(shí)效性驗(yàn)證方案,此方案若處于分布式環(huán)境會(huì)導(dǎo)致session在分布式機(jī)器間的時(shí)間不同步,但跟組里的其他工程師溝通,在分布式環(huán)境下是不是還可以同步session?
方案二適用于大型系統(tǒng),還要使用redis服務(wù),使用redis存儲(chǔ)token可是實(shí)現(xiàn)快速讀取token時(shí)效數(shù)據(jù),若將toke失效時(shí)間存儲(chǔ)到數(shù)據(jù)庫(kù)中,頻繁操作數(shù)據(jù)庫(kù),會(huì)影響數(shù)據(jù)庫(kù)的響應(yīng)時(shí)間,進(jìn)而應(yīng)用程序也會(huì)出現(xiàn)卡頓等情況。
另,token的失效時(shí)間應(yīng)該設(shè)置多長(zhǎng)需要根據(jù)所在項(xiàng)目的實(shí)際情況確定。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/82563.html
摘要:今天我們來(lái)結(jié)合實(shí)例給大家講述的實(shí)戰(zhàn)應(yīng)用,就是如何使用前端與后端實(shí)現(xiàn)用戶登錄鑒權(quán)認(rèn)證的過(guò)程。只用了一個(gè)串,建立前后端的驗(yàn)證的數(shù)據(jù)傳遞,實(shí)現(xiàn)了有效的登錄鑒權(quán)過(guò)程。 今天我們來(lái)結(jié)合實(shí)例給大家講述JWT(Json Web Token)的實(shí)戰(zhàn)應(yīng)用,就是如何使用前端Axios與后端PHP實(shí)現(xiàn)用戶登錄鑒權(quán)認(rèn)證的過(guò)程。 文中涉及的重要知識(shí)點(diǎn): axios異步請(qǐng)求:axios-基于Promise的HTT...
摘要:前言使用郵箱注冊(cè)驗(yàn)證,我們需要理清設(shè)計(jì)思路問(wèn)題一注冊(cè)信息提交后需要對(duì)填寫(xiě)的郵箱號(hào)發(fā)送郵件問(wèn)題二郵件到達(dá)時(shí)用戶如何進(jìn)行激活,是通過(guò)請(qǐng)求還是獲取驗(yàn)證碼本篇使用接口激活問(wèn)題三郵件激活如何設(shè)置有效時(shí)間通過(guò)以上三個(gè)問(wèn)題,博主來(lái)幫助大家掌握郵箱驗(yàn)證問(wèn)題 前言 使用郵箱注冊(cè)驗(yàn)證,我們需要理清設(shè)計(jì)思路: 問(wèn)題一:注冊(cè)信息提交后需要對(duì)填寫(xiě)的郵箱號(hào)發(fā)送郵件 問(wèn)題二:郵件到達(dá)時(shí)用戶如何進(jìn)行激活,是通過(guò)get...
摘要:前言現(xiàn)在的好多項(xiàng)目都是基于移動(dòng)端以及前后端分離的項(xiàng)目,之前基于的前后端放到一起的項(xiàng)目已經(jīng)慢慢失寵并淡出我們視線,尤其是當(dāng)基于的微服務(wù)架構(gòu)以及單頁(yè)面應(yīng)用流行起來(lái)后,情況更甚。使用生成是什么請(qǐng)自行百度。 1、前言 現(xiàn)在的好多項(xiàng)目都是基于APP移動(dòng)端以及前后端分離的項(xiàng)目,之前基于Session的前后端放到一起的項(xiàng)目已經(jīng)慢慢失寵并淡出我們視線,尤其是當(dāng)基于SpringCloud的微服務(wù)架構(gòu)以及...
摘要:在使用非對(duì)稱加密算法進(jìn)行簽名的時(shí)候,還可以用于驗(yàn)證的發(fā)件人是否與中申明的發(fā)件人是同一個(gè)人。如果沒(méi)有用非對(duì)稱加密算法的話,把復(fù)制之后直接可以去官網(wǎng)在線解析。 這篇博客主要是簡(jiǎn)單介紹了一下什么是JWT,以及如何在Spring Boot項(xiàng)目中使用JWT(JSON Web Token)。 1.關(guān)于JWT 1.1 什么是JWT 老生常談的開(kāi)頭,我們要用這樣一種工具,首先得知道以下幾個(gè)問(wèn)題。 這...
閱讀 1669·2021-11-17 09:33
閱讀 3531·2021-11-16 11:40
閱讀 3055·2019-08-30 11:23
閱讀 1048·2019-08-29 16:36
閱讀 2464·2019-08-29 13:23
閱讀 1738·2019-08-29 12:59
閱讀 1542·2019-08-29 12:42
閱讀 1979·2019-08-28 18:22