摘要:登錄認證幾乎是任何一個系統的標配,系統客戶端等,好多都需要注冊登錄授權認證。假設我們開發了一個電商平臺,并集成了微信登錄,以這個場景為例,說一下的工作原理。微信網頁授權是授權碼模式的授權模式。
登錄認證幾乎是任何一個系統的標配,web 系統、APP、PC 客戶端等,好多都需要注冊、登錄、授權認證。場景說明
以一個電商系統,假設淘寶為例,如果我們想要下單,首先需要注冊一個賬號。擁有了賬號之后,我們需要輸入用戶名(比如手機號或郵箱)、密碼完成登錄過程。之后如果你在一段時間內再次進入系統,是不需要輸入用戶名和密碼的,只有在連續長時間不登錄的情況下(例如一個月沒登錄過)訪問系統,再次需要輸入用戶名和密碼。如果使用頻率很頻繁,通常是一年都不用再輸一次密碼,所以經常在換了一臺電腦或者一部手機之后,一些經常使用的網站或 APP 不記得密碼了。
提煉出來整個過程大概就是如下幾步:
首次使用,需要通過郵箱或手機號注冊;
注冊完成后,需要提供用戶名和密碼完成登錄;
下次再使用,通常不會再次輸入用戶名和密碼即可直接進入系統并使用其功能(除非連續長時間未使用);
常用的認證方式 OAuth 認證OAuth 認證比較常見的就是微信登錄、微博登錄、qq登錄等,簡單來說就是利用這些比較權威的網站或應用開放的 API 來實現用戶登錄,用戶可以不用在你的網站或應用上注冊賬號,直接用已有的微信、微博、qq 等賬號登錄。
這一樣一來,即省了用戶注冊的時間,又簡化了你的系統的賬號體系。從而既可以提高用戶注冊率可以節省開發時間,同時,安全性也有了保障。
維基百科對它的解釋摘要如下:
OAuth允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每一個令牌授權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth讓用戶可以授權第三方網站訪問他們存儲在另外服務提供者的某些特定信息,而非所有內容。
假設我們開發了一個電商平臺,并集成了微信登錄,以這個場景為例,說一下 OAuth 的工作原理。
講之前需要了解其中涉及到的幾個角色:
用戶:即使用我們平臺的用戶
用戶終端:即最終用戶使用的 APP 端或 web 端
應用服務器端:即我們的服務器端
授權服務器端:這里就是微信處理授權請求的服務器
好的,接下來開始在我們的電商平臺web端實現微信登錄功能。微信網頁授權是授權碼模式(authorization code)的 OAuth 授權模式。
我們電商平臺的用戶過來登錄,常用場景是點擊“微信登錄”按鈕;
接下來,用戶終端將用戶引導到微信授權頁面;
用戶同意授權,應用服務器重定向到之前設置好的 redirect_uri (應用服務器所在的地址),并附帶上授權碼(code);
應用服務器用上一步獲取的 code 向微信授權服務器發送請求,獲取 access_token,也就是上面說的令牌;
之后應用服務器用上一步獲取的 access_token 去請求微信授權服務器獲取用戶的基本信息,例如頭像、昵稱等;
Cookie-Session 認證早期互聯網以 web 為主,客戶端是瀏覽器,所以 Cookie-Session 方式最那時候最常用的方式,直到現在,一些 web 網站依然用這種方式做認證。
認證過程大致如下:
用戶輸入用戶名、密碼或者用短信驗證碼方式登錄系統;
服務端驗證后,創建一個 Session 信息,并且將 SessionID 存到 cookie,發送回瀏覽器;
下次客戶端再發起請求,自動帶上 cookie 信息,服務端通過 cookie 獲取 Session 信息進行校驗;
弊端
只能在 web 場景下使用,如果是 APP 中,不能使用 cookie 的情況下就不能用了;
即使能在 web 場景下使用,也要考慮跨域問題,因為 cookie 不能跨域;
cookie 存在 CSRF(跨站請求偽造)的風險;
如果是分布式服務,需要考慮 Session 同步問題;
Cookie-Session 改造版由于傳統的 Cookie-Session 認證存在諸多問題,可以把上面的方案改造一下。改動的地方如下:
不用 cookie 做客戶端存儲,改用其他方式,web 下使用 local storage,APP 中使用客戶端數據庫,這樣就實現了跨域,并且避免了 CSRF ;
服務端也不存 Session 了,把 Session 信息拿出來存到 Redis 等內存數據庫中,這樣即提高了速度,又避免了 Session 同步問題;
經過改造之后變成了如下的認證過程:
用戶輸入用戶名、密碼或者用短信驗證碼方式登錄系統;
服務端經過驗證,將認證信息構造好的數據結構存儲到 Redis 中,并將 key 值返回給客戶端;
客戶端拿到返回的 key,存儲到 local storage 或本地數據庫;
下次客戶端再次請求,把 key 值附加到 header 或者 請求體中;
服務端根據獲取的 key,到 Redis 中獲取認證信息;
基于JWT的Token認證上面的方案雖然經過了改版,但還是需要客戶端和服務器端維持一個狀態信息,比如用 cookie 換 session ,或者用 key 換 Redis 的 value 信息,基于 JWT 的 Token 認證方案可以省去這個過程。
JSON Web Token(JWT)是一個非常輕巧的規范。這個規范允許我們使用JWT在用戶和服務器之間傳遞安全可靠的信息。
認證過程
依然是用戶登錄系統;
服務端驗證,將認證信息通過指定的算法(例如HS256)進行加密,例如對用戶名和用戶所屬角色進行加密,加密私鑰是保存在服務器端的,將加密后的結果發送給客戶端,加密的字符串格式為三個"." 分隔的字符串 Token,分別對應頭部、載荷與簽名,頭部和載荷都可以通過 base64 解碼出來,簽名部分不可以;
客戶端拿到返回的 Token,存儲到 local storage 或本地數據庫;
下次客戶端再次發起請求,將 Token 附加到 header 中;
服務端獲取 header 中的 Token ,通過相同的算法對 Token 中的用戶名和所屬角色進行相同的加密驗證,如果驗證結果相同,則說明這個請求是正常的,沒有被篡改。這個過程可以完全不涉及到查詢 Redis 或其他存儲;
優點
使用 json 作為數據傳輸,有廣泛的通用型,并且體積小,便于傳輸;
不需要在服務器端保存相關信息;
jwt 載荷部分可以存儲業務相關的信息(非敏感的),例如用戶信息、角色等;
總結綜上所述,JWT 可以作為首選的認證方案。當然,具體的情況具體分析,還要看是不是適合真實的應用場景。除了上述的這些,涉及到信息安全的,建議全部采用 https 方式部署,采用 https 方式,信息很難被嗅探破解,對應用的安全性很重要。
參考信息:
OAuth: http://www.ruanyifeng.com/blo...
JWT:https://jwt.io/introduction/ http://blog.leapoahead.com/20...
JWT Java 庫: https://github.com/jwtk/jjwt
別等了,掃碼上車吧。文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68427.html
摘要:先說下我面試情況,我一共面試了家公司。篇在我面試的眾多公司里,只有同城的面問到相關問題,其他公司壓根沒問。我自己回答的是自己開發組件面臨的問題。完全不用擔心對方到時候打電話核對的問題。 2019的5月9號,離發工資還有1天的時候,我的領導親切把我叫到辦公室跟我說:阿郭,我們公司要倒閉了,錢是沒有的啦,為了不耽誤你,你趕緊出去找工作吧。聽到這話,我虎軀一震,這已經是第2個月沒工資了。 公...
摘要:下面代碼會存在什么問題,如何改進一行代碼輸出之間的所有偶數。簡述進程之間如何通信多路復用的作用模型的區別什么是并發和并行解釋什么是異步非阻塞的作用面試題說說你知道的命令如何查看某次提交修改的內容答案掃碼下面的二維碼訂閱即可獲取。 引言 最近在刷面試題,所以需要看大量的 Python 相關的面試題,從大量的題目中總結了很多的知識,同時也對一些題目進行拓展了,但是在看了網上的大部分面試題不...
摘要:說一說迭代器通過集合對象獲取其對應的對象判斷是否存在下一個元素取出該元素并將迭代器對象指向下一個元素取出元素的方式迭代器。對于使用容器者而言,具體的實現不重要,只要通過容器獲取到該實現的迭代器的對象即可,也就是方法。 前言 歡迎關注微信公眾號:Coder編程獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!** 本章主要介紹Collection集合相關知識,結合面試中會提到...
摘要:面試官比較著急了,跟我溝通的時候,我才知道返回值不一定非要跟原生的一樣。騰訊一面平常開發怎么設計組件的??偨Y騰訊面試的感覺就是,沒有那么正式,都是部門的技術直接聯系的你,然后二面就是部門負責人了,決定了是否入職。 引入 面試過去了這么久,把八月份面試題和總結發一下吧,雖然年底大家可能都不換工作~ 還是可以看看的。 關于面試,引用葉老濕的一句話。你的簡歷是自己工作的答卷,項目經歷是你給面...
摘要:雖然效果一樣,但是這兩種換行的方式使用起來卻不同。使用換行這種方式用起來比較坑,所以本文章的重點就是這一部分。因為之前知道彈框中要實現換行,只能通過的方式,而不能通過的方式。在元素上使用等方式,發現都是可以實現換行的。 前言 最近遇到這樣一個需求:需要在頁面中顯示一段第三方文本信息。這些文本完全由第三方自己定義,我們負責顯示在頁面即可,第三方要求這些文本需要換行顯示即可。 我們都知道在...
閱讀 2743·2021-10-26 09:50
閱讀 2385·2021-10-11 11:08
閱讀 2128·2019-08-30 15:53
閱讀 1906·2019-08-30 15:44
閱讀 2382·2019-08-28 18:12
閱讀 2519·2019-08-26 13:59
閱讀 2852·2019-08-26 12:19
閱讀 2751·2019-08-26 12:09