說一說幾種常用的登錄認證方式,你用的哪種

来源:https://www.cnblogs.com/fengzheng/archive/2018/02/05/8416393.html
-Advertisement-
Play Games

登錄認證幾乎是任何一個系統的標配,web 系統、APP、PC 客戶端等,好多都需要註冊、登錄、授權認證。 場景說明 以一個電商系統,假設淘寶為例,如果我們想要下單,首先需要註冊一個賬號。擁有了賬號之後,我們需要輸入用戶名(比如手機號或郵箱)、密碼完成登錄過程。之後如果你在一段時間內再次進入系統,是不 ...


登錄認證幾乎是任何一個系統的標配,web 系統、APP、PC 客戶端等,好多都需要註冊、登錄、授權認證。

場景說明

以一個電商系統,假設淘寶為例,如果我們想要下單,首先需要註冊一個賬號。擁有了賬號之後,我們需要輸入用戶名(比如手機號或郵箱)、密碼完成登錄過程。之後如果你在一段時間內再次進入系統,是不需要輸入用戶名和密碼的,只有在連續長時間不登錄的情況下(例如一個月沒登錄過)訪問系統,再次需要輸入用戶名和密碼。如果使用頻率很頻繁,通常是一年都不用再輸一次密碼,所以經常在換了一臺電腦或者一部手機之後,一些經常使用的網站或 APP 不記得密碼了。

提煉出來整個過程大概就是如下幾步:

  1. 首次使用,需要通過郵箱或手機號註冊;
  2. 註冊完成後,需要提供用戶名和密碼完成登錄;
  3. 下次再使用,通常不會再次輸入用戶名和密碼即可直接進入系統並使用其功能(除非連續長時間未使用);

常用的認證方式

OAuth 認證

OAuth 認證比較常見的就是微信登錄、微博登錄、qq登錄等,簡單來說就是利用這些比較權威的網站或應用開放的 API 來實現用戶登錄,用戶可以不用在你的網站或應用上註冊賬號,直接用已有的微信、微博、qq 等賬號登錄。

這一樣一來,即省了用戶註冊的時間,又簡化了你的系統的賬號體系。從而既可以提高用戶註冊率可以節省開發時間,同時,安全性也有了保障。

維基百科對它的解釋摘要如下:

OAuth允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每一個令牌授權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth讓用戶可以授權第三方網站訪問他們存儲在另外服務提供者的某些特定信息,而非所有內容。

假設我們開發了一個電商平臺,並集成了微信登錄,以這個場景為例,說一下 OAuth 的工作原理。

講之前需要瞭解其中涉及到的幾個角色:

  • 用戶:即使用我們平臺的用戶
  • 用戶終端:即最終用戶使用的 APP 端或 web 端
  • 應用伺服器端:即我們的伺服器端
  • 授權伺服器端:這裡就是微信處理授權請求的伺服器

好的,接下來開始在我們的電商平臺web端實現微信登錄功能。微信網頁授權是授權碼模式(authorization code)的 OAuth 授權模式。

  1. 我們電商平臺的用戶過來登錄,常用場景是點擊“微信登錄”按鈕;
  2. 接下來,用戶終端將用戶引導到微信授權頁面;
  3. 用戶同意授權,應用伺服器重定向到之前設置好的 redirect_uri (應用伺服器所在的地址),並附帶上授權碼(code);
  4. 應用伺服器用上一步獲取的 code 向微信授權伺服器發送請求,獲取 access_token,也就是上面說的令牌;
  5. 之後應用伺服器用上一步獲取的 access_token 去請求微信授權伺服器獲取用戶的基本信息,例如頭像、昵稱等;

早期互聯網以 web 為主,客戶端是瀏覽器,所以 Cookie-Session 方式最那時候最常用的方式,直到現在,一些 web 網站依然用這種方式做認證。

認證過程大致如下:

  1. 用戶輸入用戶名、密碼或者用簡訊驗證碼方式登錄系統;
  2. 服務端驗證後,創建一個 Session 信息,並且將 SessionID 存到 cookie,發送回瀏覽器;
  3. 下次客戶端再發起請求,自動帶上 cookie 信息,服務端通過 cookie 獲取 Session 信息進行校驗;

弊端

  • 只能在 web 場景下使用,如果是 APP 中,不能使用 cookie 的情況下就不能用了;
  • 即使能在 web 場景下使用,也要考慮跨域問題,因為 cookie 不能跨域;
  • cookie 存在 CSRF(跨站請求偽造)的風險;
  • 如果是分散式服務,需要考慮 Session 同步問題;

由於傳統的 Cookie-Session 認證存在諸多問題,可以把上面的方案改造一下。改動的地方如下:

  • 不用 cookie 做客戶端存儲,改用其他方式,web 下使用 local storage,APP 中使用客戶端資料庫,這樣就實現了跨域,並且避免了 CSRF ;
  • 服務端也不存 Session 了,把 Session 信息拿出來存到 Redis 等記憶體資料庫中,這樣即提高了速度,又避免了 Session 同步問題;

經過改造之後變成瞭如下的認證過程:

  1. 用戶輸入用戶名、密碼或者用簡訊驗證碼方式登錄系統;
  2. 服務端經過驗證,將認證信息構造好的數據結構存儲到 Redis 中,並將 key 值返回給客戶端;
  3. 客戶端拿到返回的 key,存儲到 local storage 或本地資料庫;
  4. 下次客戶端再次請求,把 key 值附加到 header 或者 請求體中;
  5. 服務端根據獲取的 key,到 Redis 中獲取認證信息;

基於JWT的Token認證

上面的方案雖然經過了改版,但還是需要客戶端和伺服器端維持一個狀態信息,比如用 cookie 換 session ,或者用 key 換 Redis 的 value 信息,基於 JWT 的 Token 認證方案可以省去這個過程。

JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用JWT在用戶和伺服器之間傳遞安全可靠的信息。

認證過程

  1. 依然是用戶登錄系統;
  2. 服務端驗證,將認證信息通過指定的演算法(例如HS256)進行加密,例如對用戶名和用戶所屬角色進行加密,加密私鑰是保存在伺服器端的,將加密後的結果發送給客戶端,加密的字元串格式為三個"." 分隔的字元串 Token,分別對應頭部載荷簽名,頭部和載荷都可以通過 base64 解碼出來,簽名部分不可以;
  3. 客戶端拿到返回的 Token,存儲到 local storage 或本地資料庫;
  4. 下次客戶端再次發起請求,將 Token 附加到 header 中;
  5. 服務端獲取 header 中的 Token ,通過相同的演算法對 Token 中的用戶名和所屬角色進行相同的加密驗證,如果驗證結果相同,則說明這個請求是正常的,沒有被篡改。這個過程可以完全不涉及到查詢 Redis 或其他存儲;

優點

  • 使用 json 作為數據傳輸,有廣泛的通用型,並且體積小,便於傳輸;
  • 不需要在伺服器端保存相關信息;
  • jwt 載荷部分可以存儲業務相關的信息(非敏感的),例如用戶信息、角色等;

總結

綜上所述,JWT 可以作為首選的認證方案。當然,具體的情況具體分析,還要看是不是適合真實的應用場景。除了上述的這些,涉及到信息安全的,建議全部採用 https 方式部署,採用 https 方式,信息很難被嗅探破解,對應用的安全性很重要。

參考信息:

OAuth: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

JWT:https://jwt.io/introduction/ http://blog.leapoahead.com/2015/09/06/understanding-jwt/

JWT Java 庫: https://github.com/jwtk/jjwt

別等了,掃碼上車吧。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • electron官網提供的demo項目,在npm install 的時候總是報錯顯示安裝失敗, 解決辦法:翻牆即可成功安裝。 ...
  • 上拉載入的思路 1 上拉載入是要把屏幕拉到最底部的時候觸發ajax事件請求數據 2.所有要獲取屏幕的高度 文檔的高度 和滾動的高度 下麵的代碼是已經做好了相容的可以直接拿來用 3.首先要預設載入第一頁,在window.onload調用upDown這個方法 4.當頁面滾到底部的時候觸發up()這個方法 ...
  • 前言:最近要使用百度地圖實現樓盤可視化的功能,因此最基礎的功能就是將地圖網格化以後實現不同地域的樓盤劃分; 1,自行去百度地圖的開放平臺申請秘鑰哈,這裡我就把自己的秘鑰貼出來了;ak=A3CklGvnFOjkAzKzay2dySgfdig0GKz4 2,新建一個簡單頁面,下麵我把自己的頁面貼出來 3 ...
  • 本文最初發表於 "博客園" ,併在 "GitHub" 上持續更新 前端的系列文章 。歡迎在GitHub上關註我,一起入門和進階前端。 以下是正文。 前言 jQuery提供的一組網頁中常見的動畫效果,這些動畫是標準的、有規律的效果;同時還提供給我們了自定義動畫的功能。 顯示動畫 方式一: 解釋:無參數 ...
  • 1、window.screen.height window.screen.height:設備顯示屏的高度 (1)解析度為1080px的顯示屏 (2)手機屏 2、window.screen.availHeight 屏幕的可用高度 (1)解析度為1080px的顯示屏 (2)手機屏 3、document. ...
  • 容器的屬性 項目的屬性 ...
  • target:指定框架集中的哪個框架來裝在另一個資源,該屬性可以是_self、_blank、_top、_parent四個值,分別代表使用自身、新視窗、頂層框架、父框架來裝載新資源。 alt只是在圖片無法載入的還是才會顯示出提示文字,如果想讓圖片無論怎樣都顯示,用title 如果希望獲得最佳表單性能, ...
  • 對於剛接觸ubuntu的同學來說,一切都是新的,一切都是那麼熟悉而又不熟悉的.不管是作為一個前端工程師還是一個後端工程師,我相信大家知道nodejs,但是如果希望自己能夠在ubuntu上面使用nodejs,是需要給點功夫去做的. 當然對於一個ubuntuer來說 這個命令就再熟悉不過了,也是經常用的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...