多帳戶的統一登陸

名稱解釋

這裏的多帳戶區別於系統級別的,咱們講的多帳戶系統是指,在咱們互聯網應用當中,咱們的應用會使用多個第三方帳號進行登陸,必須如今經常使用的APP(網易雲音樂)登陸方式包含:網易、微信、QQ前端

內容

經過這一篇文章, 能夠學到:多用戶下面的技術方案細節,以及相應的表設計,流程設計。 不能夠:與其餘文章同樣,我這裏不會有具體代碼實現細節,方案作的對,代碼咋寫都不會太爛。 網易登陸.png redis

架構演進

創業初期

歸結爲創業初期是由於這個時候用戶量比較少,甚至尚未接入上面所說的其餘第三方的帳戶系統,只是自建的體系就能夠知足,自建體系的話,目前經常使用的有數據庫

用戶名密碼註冊登錄

這種方式在不少初期網站建設會使用,先註冊,再進行登陸,在老一點的cms中都能找到這個影子。服務器

流程圖:微信

流程說明:架構

  1. 前端將用戶名、密碼發送到服務器,服務器進行常規的判斷,判斷用戶名、密碼長度是否知足,用戶名是否重複等條件,條件不經過直接返回對應錯誤碼給到前端,這裏密碼字段,爲了防止傳輸過程當中被截胡,建議加密再上傳,咱們的傳輸密碼默認都是會進行一個md5加密,而後記錄到數據庫再進行一層加密,就算是脫庫也沒事,密碼不要明文存儲。
  2. 校驗經過後,就將用戶名密碼寫入數據庫,並進行後面積分發放等操做,這裏不展開。
  3. 如今進行登陸,前端將用戶名,密碼發送給到服務端,服務端首先會校驗登陸次數是否超過設置的閾值,若是超過只能繼續等待被關小黑屋。
  4. 若是未超過繼續登陸邏輯,判斷用戶名、密碼是否正確,不正確密碼則進行閾值的判斷,若是超過則關小黑屋,記住小黑屋必須設置過時時間,要否則就會永久關上了,這個能夠用redis的過時來作。
  5. 登陸成功後進行後續的一切後置邏輯,好比加積分。。。等操做。

手機號註冊登錄

流程圖:app

流程說明:

  1. 首先輸入手機號,而後發送到服務端,服務端將手機號記錄在咱們數據庫中,而後生成隨機驗證碼,並將手機號和驗證碼綁定到一個redis裏面,而後記錄過時時間,這個過時時間通常是10分鐘左右,這就是咱們通常手機驗證碼的有效期。
  2. 手機接收到手機短信後,那麼就在界面填寫驗證碼發送服務端,服務端收到驗證碼後就會在redis裏面查詢到這個手機號對應的驗證碼,失敗就返回錯誤碼。
  3. 成功後就進行登陸操做。

這裏看起來沒有明確的註冊登陸操做,其實在發送手機號碼就能夠認爲是一個常規的註冊,而後後面的驗證碼輸入就是一個登錄操做,數據庫設計

問: 那我要密碼咋辦?學習

答: 在後續產品裏面增長一個手機號碼密碼補錄的功能便可,這也是如今很常規的手法,可是如今移動互聯網大爆炸時代,密碼已經顯得不是那麼重要了,反正我歷來記不住密碼,若是手機號碼能操做的app,絕對不用密碼來操做。網站

數據庫設計

表結構

自增id 用戶名 密碼 手機號 錯誤次數
1 user1 7fef6171469e80d32c0559f88b377245 13456789012 0
2 user2 7fef6171469e80d32c0559f88b377245 13456789013 0

說明

  1. 這裏只是單純說明須要用到的數據,沒有擴展具體場景,這個表結構可以知足上面兩個方案的設計。

引入第三方帳戶方案

這裏是以QQ-SDK的登陸邏輯, 咱們先來一波時序圖

說明:

  1. 客戶端本身調起登陸的界面,進行輸入用戶名、密碼,這裏的是第三方的用戶名,密碼,登陸成功後,會返回access_token openid expire_in,這過程會使用到oauth2.0,不過在sdk裏面進行內置回調獲取了,後面咱們會說明咱們自身實現的oauth2.0
  2. 客戶端拿到access_token、openid、login_type(qq、wechat...)請求應用服務器,應用服務器拿到這些數據後就會根據對應的login_type去對應的用戶中心進行access_token和openid進行校驗。校驗不經過則返回對應錯誤碼
  3. 校驗經過後就會判斷本地是否有這個login_type和openid是否存在,不存在則進行獲取遠程的用戶名、頭像等基礎信息來做爲本地基礎數據,而且返回code值
  4. 若是已經存在,那就是進行登陸操做,返回code值。
  5. 客戶端拿到code值後進行token值的換取,這個徹底遵守oauth2.0的協議來走的,後續每次請求必須帶上token,token值在服務端的時間比較久,由於咱們想要作的是那種永不下線的操做,因此每次請求咱們都將token過時時間進行累加。

數據庫設計

表結構

對於評論處 @講不出再見1486617502000 的建議,我這裏作一下數據庫的整理 用戶基礎表(users)

字段 備註
user_id 用戶id
token 用戶登錄的token
expire_in token過時時間
try_times 登陸失敗次數

用戶驗證關聯表(user_auth_rel)

字段 備註
id 自增id
user_id 用戶id
auth_id 驗證表id
auth_type 驗證類型(local、third)

本地用戶表(user_local_auth)

字段 備註
auth_id 認證id,自增id
user_name 用戶惟一標識
password 用戶密碼
mobile 用戶手機

第三方用戶表(user_third_auth)

字段 備註
auth_id 用戶id
openid 第三方用戶惟一標識
login_type 第三方平臺標識(qq、wechat...)
access_token 第三方獲取的access_token,校驗使用

說明

  1. users表只是單純針對咱們業務側的登陸,主要是作自身業務的oauth2.0業務,
  2. user_local_auth是作本身用戶名、密碼登陸,手機號碼登陸信息記錄,
  3. user_third_auth是咱們第三方用戶體系的數據記錄,
  4. user_auth_rel是用來關聯咱們users表與user_local_auth、user_third_auth。
  5. 整個設計理念就是將自建用戶與第三方在存儲上區分,這在架構演進上也是合乎情理的,開始用戶體系大多自建,然後纔是對外接入。

總結

  1. 總的來說,第三方用戶的接入技術上來說是比較簡單的,這裏設計多一個user_thirds是能夠支持足夠多的第三方接入,固然通常咱們也就兩三個登陸就好,太多登陸方不只自身維護成本,界面擺盤也很差看不是。
  2. 但願你們可以經過以上學習,可以對於咱們多帳戶登陸有一個比較好的認知,這裏設計方案不包含分表分庫、沒有服務化,就是簡單直接的設計,固然用戶量和須要的不同,在這個基礎上還要加不少東西,謝謝你們閱讀!!!
相關文章
相關標籤/搜索