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