面試:讓你設計一個第三方賬號登陸你該如何實現?
名稱解釋
這裡的多賬戶區別於系統級別的,我們講的多賬戶系統是指,在我們網際網路應用當中,我們的應用會使用多個第三方賬號進行登入,必須現在常用的APP(網易雲音樂)登入方式包含:網易、微信、QQ
內容
通過這一篇文章, 可以學到:多使用者下面的技術方案細節,以及相應的表設計,流程設計。 不可以:與其他文章一樣,我這裡不會有具體程式碼實現細節,方案做的對,程式碼咋寫都不會太爛。
架構演進
創業初期
歸結為創業初期是因為這個時候使用者量比較少,甚至還沒有接入上面所說的其他第三方的賬戶系統,只是自建的體系就可以滿足,自建體系的話,目前常用的有
使用者名稱密碼註冊登陸
這種方式在很多初期網站建設會使用,先註冊,再進行登入,在老一點的cms中都能找到這個影子。
流程圖:
流程說明:
- 前端將使用者名稱、密碼傳送到伺服器,伺服器進行常規的判斷,判斷使用者名稱、密碼長度是否滿足,使用者名稱是否重複等條件,條件不通過直接返回對應錯誤碼給到前端,這裡密碼欄位,為了防止傳輸過程中被截胡,建議加密再上傳,我們的傳輸密碼預設都是會進行一個md5加密,然後記錄到資料庫再進行一層加密,就算是脫庫也沒事,密碼不要明文儲存。
- 校驗通過後,就將使用者名稱密碼寫入資料庫,並進行後面積分發放等操作,這裡不展開。
- 現在進行登入,前端將使用者名稱,密碼傳送給到服務端,服務端首先會校驗登入次數是否超過設定的閾值,如果超過只能繼續等待被關小黑屋。
- 如果未超過繼續登入邏輯,判斷使用者名稱、密碼是否正確,不正確密碼則進行閾值的判斷,如果超過則關小黑屋,記住小黑屋必須設定過期時間,要不然就會永久關上了,這個可以用redis的過期來做。
- 登入成功後進行後續的一切後置邏輯,比如加積分。。。等操作。
手機號註冊登陸
流程圖:
流程說明:
- 首先輸入手機號,然後傳送到服務端,服務端將手機號記錄在我們資料庫中,然後生成隨機驗證碼,並將手機號和驗證碼繫結到一個redis裡面,然後記錄過期時間,這個過期時間一般是10分鐘左右,這就是我們一般手機驗證碼的有效期。
- 手機接收到手機簡訊後,那麼就在介面填寫驗證碼傳送服務端,服務端收到驗證碼後就會在redis裡面查詢到這個手機號對應的驗證碼,失敗就返回錯誤碼。
- 成功後就進行登入操作。
這裡看起來沒有明確的註冊登入操作,其實在傳送手機號碼就可以認為是一個常規的註冊,然後後面的驗證碼輸入就是一個登陸操作,
問: 那我要密碼咋辦?
答: 在後續產品裡面增加一個手機號碼密碼補錄的功能即可,這也是現在很常規的手法,但是現在移動網際網路大爆炸時代,密碼已經顯得不是那麼重要了,反正我從來記不住密碼,如果手機號碼能操作的app,絕對不用密碼來操作。
資料庫設計
表結構
自增id | 使用者名稱 | 密碼 | 手機號 | 錯誤次數 |
---|---|---|---|---|
1 | user1 | 7fef6171469e80d32c0559f88b377245 | 13456789012 | 0 |
2 | user2 | 7fef6171469e80d32c0559f88b377245 | 13456789013 | 0 |
說明
- 這裡只是單純說明需要用到的資料,沒有擴充套件具體場景,這個表結構能夠滿足上面兩個方案的設計。
引入第三方賬戶方案
這裡是以QQ-SDK的登入邏輯, 我們先來一波時序圖
說明:
- 客戶端自己調起登入的介面,進行輸入使用者名稱、密碼,這裡的是第三方的使用者名稱,密碼,登入成功後,會返回access_token openid expire_in,這過程會使用到oauth2.0,不過在sdk裡面進行內建回撥獲取了,後面我們會說明我們自身實現的oauth2.0
- 客戶端拿到access_token、openid、login_type(qq、wechat...)請求應用伺服器,應用伺服器拿到這些資料後就會根據對應的login_type去對應的使用者中心進行access_token和openid進行校驗。校驗不通過則返回對應錯誤碼
- 校驗通過後就會判斷本地是否有這個login_type和openid是否存在,不存在則進行獲取遠端的使用者名稱、頭像等基礎資訊來作為本地基礎資料,並且返回code值
- 如果已經存在,那就是進行登入操作,返回code值。
- 客戶端拿到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,校驗使用 |
說明
- users表只是單純針對我們業務側的登入,主要是做自身業務的oauth2.0業務,
- user_local_auth是做自己使用者名稱、密碼登入,手機號碼登入資訊記錄,
- user_third_auth是我們第三方使用者體系的資料記錄,
- user_auth_rel是用來關聯我們users表與user_local_auth、user_third_auth。
- 整個設計理念就是將自建使用者與第三方在儲存上區分,這在架構演進上也是合乎情理的,開始使用者體系大多自建,而後才是對外接入。
總結
- 總的來講,第三方使用者的接入技術上來講是比較簡單的,這裡設計多一個user_thirds是可以支援足夠多的第三方接入,當然一般我們也就兩三個登入就好,太多登入方不僅自身維護成本,介面擺盤也不好看不是。
- 希望大家能夠通過以上學習,能夠對於我們多賬戶登入有一個比較好的認知,這裡設計方案不包含分表分庫、沒有服務化,就是簡單直接的設計,當然使用者量和需要的不一樣,在這個基礎上還要加很多東西,謝謝大家閱讀!!!
關注微信公眾號【程式設計師的夢想】,專注於Java,SpringBoot,SpringCloud,微服務,Docker以及前後端分離等全棧技術。
相關推薦
面試:讓你設計一個第三方賬號登陸你該如何實現?
名稱解釋 這裡的多賬戶區別於系統級別的,我們講的多賬戶系統是指,在我們網際網路應用當中,我們的應用會使用多個第三方賬號進行登入,必須現在常用的APP(網易雲音樂)登入方式包含:網易、微信、QQ 內容 通過這一篇文章, 可以學到:多使用者下面的技術方案細節,以及相應的表設計,流程設計。 不可以:與其他文章一樣,
技術乾貨:從零開始,教你設計一個百萬級的訊息推送系統
1、點評 本文主要分享的是如何從零設計開發一箇中大型推送系統,因限於篇幅,文中有些鍵技術只能一筆帶過,建議有這方面興趣的讀者可以深入研究相關知識點,從而形成橫向知識體系。 本文適合有一定開發、架構經驗的後端程式設計師閱讀,文內個別技術點可能並非最佳實踐,但至少都是生動的實踐分享,至少能起到拋磚引玉的作用
競價托管三板斧:讓有需求的客戶快速找到你
優化 運營 想要 成本 模式 dad 競價 差異 tex 搜索引擎競價推廣是現在網絡營銷主流的廣告模式,這種模式見效快、投入低受到中小企業的 喜歡,基本做網絡營銷的企業都有開通競價推廣,都有去做競價推廣原文,這種模式雖然是付費推 廣,但並不是消費了就能帶來好的效果,到現在許
手把手教你設計一個百萬級的訊息推送系統
本文分享的內容不但可以滿足物聯網領域同時還支援以下場景: 基於 Web 的聊天系統(點對點、群聊)。 Web 應用中需求服務端推送的場景。 基於 SDK 的訊息推送平臺。 技術選型 要滿足大量的連線數、同時支援雙全工通訊,並且效能也得有保障。 在 Java 技術
教你設計一個接收機和發射機FDD系統
衛星通訊、雷達和訊號情報(SIGINT)領域的許多航空航天和防務電子系統早就要求使用一部分或全部X和Ku頻段。隨著這些應用轉向更加便攜的平臺,如無人機(UAV)和手持式無線電等,開發在X和Ku波段工作,同時仍然保持極高效能水平的新型小尺寸、低功耗無線電設計變得至關重要。本文介
零基礎入門python第002講課後測試題及答案:用python設計一個小遊戲
0. 什麼是BIF? BIF 就是 Built-in Functions,內建函式。為了方便程式設計師快速編寫指令碼程式(指令碼就是要程式設計速度快快快!!!),Python 提供了非常豐富的內建函式,我們只需要直接呼叫即可,例如 print() 的功能是“列印到螢幕”,input() 的作用是接收使用者輸入
指標_習題:運用指標設計一個函式_輸入一個整數,輸出其對應的16進位制數
/* 運用指標設計一個程式_輸入一個整數,輸出其對應的16進位制數,要求用到函式 */# include <stdio.h>void tran(int *p){ printf("十進位制 %d 轉化成十六進位制為:%#X\n", *p, *p);}int main(void){ int num;
More Effective C++ Item M31:讓函式根據一個以上的物件來決定怎麼虛擬
1.3 Item M31:讓函式根據一個以上的物件來決定怎麼虛擬有時,借用一下Jacqueline Susann的話:一次是不夠的。例如你有著一個光輝形象、崇高聲望、豐厚薪水的程式設計師工作,在Redmond,Wshington的一個著名軟體公司--當然,我說的就是任天堂。為
阿里面試:MySQL如何設計索引更高效?
有情懷,有乾貨,微信搜尋【三太子敖丙】關注這個不一樣的程式設計師。 本文 GitHub https://github.com/JavaFamily 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。 前言 資料庫系列更新到現在我想大家對所有的概念都已有個大概認識了,這周我在看評論的時候我發現有個網友的
涼了呀,面試官叫我設計一個排行榜。
這是why哥的第89篇原創文章 前兩天,有一個讀者給我發了一張圖片。 我問:發什麼腎麼事了? 於是有了這樣的對話: 他發的圖,就是微信運動步數排行榜的截圖: 其實扯了這麼多,這就是個常見的面試場景題:如何設計一個排行榜? 這個題吧,其實就是考你面試準備範圍的廣度,見過就會答,沒見過...就難說了。 當
如果你是一個老板,你會選用Python還是會選用Java技術
java python web項目 本文主要是對網上觀點的綜合與歸納。如果想在Java與Python之間選擇一種技術來實現Web,老板會選擇哪樣技術呢?老板考慮問題自然是從商業角度上來考慮,對於生意人而言,技術只是獲取商業利益的手段。Python目前偏重在數據處理,自動化運維,web開發。孤立比較
第三方賬號登陸-sina微博_PC篇
整個的流程圖跟前一篇介紹QQ的一致。那我們就直接看下具體的實現流程跟步驟。 第一步: 完善個人資訊,需要身份驗證,身份證正反面拍照等等。完善後點選微連結。會出現下圖所示介面。 點選開始接入,會出現下圖所示介面: 驗證環節跟QQ的驗證一樣, 除此之外還提供了一個檔案
設計一個getMin功能的棧,如果面試官讓你寫一個數組類,一定不要用指標去管理new出來原生的陣列,那就是在給自己挖坑
//設計實現一個getMin功能的棧 #include <iostream> #include <stack> using namespace std; class GetMinStack { public: void push(int x)
面試問題:讓你畫出某種設計模式的類圖
建立型模式: 1.AbstractFactoty(抽象工廠) 2.Builder(建造者模式) 3.FactoryMethod(工廠方法) 4.ProtoType(原型): 5.SingleTon(單例) 結構型模式: 1.Adapter(介面卡) 類介面卡: 物件介面卡
面試最讓你手足無措的一個問題:你的系統如何支撐高並發?
分享圖片 基本 建議 ges 組合 blog tps 為什麽 增加 這篇文章,我們聊聊大量同學問我的一個問題,面試的時候被問到一個讓人特別手足無措的問題:你的系統如何支撐高並發? 大多數同學被問到這個問題壓根兒沒什麽思路去回答,不知道從什麽地方說起,其實本質就是沒經歷過一些
讓我為你介紹一個神器:Chimee,一套可擴展的 H5 視頻播放器解決方案
包括 api 人員 保持 打包 需求 解耦 日常 開發 Chimee(讀“奇米”, [t??‘m?:])是由奇舞團開源的一套 H5 視頻播放器解決方案,由奇舞團視頻雲前端團隊結合在業務和視頻編解碼方向的沈澱積累傾心打造。 Chimee 支持 MP4、M3U8、FLV 等
webpack-第02節:讓你快速上手一個Demo
bpa live data- ati translate 輸入 理解 dex ans 上節課已經安裝好了Webpack到電腦上,這節課就開始一個簡單的Demo,讓你快速上手和熟悉Webpack的基本用法,學習並作完這節課內容你就可以和朋友小吹一下說:我也會Webpack。
UI設計教程分享:讓你徹底讀懂字型
一份普普通通、規規矩矩的設計 一份讓人印象深刻、新穎有趣的設計 差在哪?其實就差在三個字上! “優秀的設計不是每一個細節都有亮點,而是弱化其他元素,讓某一個亮點最大化。” 今天“驫叔的設計心得”就來總結一下關於“字”的心得。 在設計和選擇字型前,我們要先想
手把手教你做一個 C 語言編譯器(1):設計
本章是“手把手教你構建 C 語言編譯器”系列的第二篇,我們要從整體上講解如何設計我們的 C 語言編譯器。 本系列: 首先要說明的是,雖然標題是編譯器,但實際上我們構建的是 C 語言的直譯器,這意味著我們可以像執行指令碼一樣去執行 C 語言的原始碼檔案。這麼做的理由
程式設計師面試金典: 9.4樹與圖 4.2給定有向圖,設計一個演算法,找出兩個節點之間是否存在一條路徑。
#include <iostream> #include <stdio.h> #include <vector> #include <queue> using namespace std; /* 問題:給定有向圖,設計一個