如何設(shè)計 QQ、微信、微博、Github 等第三方賬號登陸 ?(附表設(shè)計)

前言:多賬戶登陸

1. 創(chuàng)業(yè)初期
用戶名密碼注冊登陸

前端將用戶名、密碼發(fā)送到服務(wù)器,服務(wù)器進(jìn)行常規(guī)的判斷,判斷用戶名、密碼長度是否滿足,用戶名是否重復(fù)等條件,條件不通過直接返回對應(yīng)錯誤碼給到前端,這里密碼字段,為了防止傳輸過程中被截胡,建議加密再上傳,我們的傳輸密碼默認(rèn)都是會進(jìn)行一個md5加密,然后記錄到數(shù)據(jù)庫再進(jìn)行一層加密,就算是脫庫也沒事,密碼不要明文存儲。 校驗通過后,就將用戶名密碼寫入數(shù)據(jù)庫,并進(jìn)行后面積分發(fā)放等操作,這里不展開。 現(xiàn)在進(jìn)行登錄,前端將用戶名,密碼發(fā)送給到服務(wù)端,服務(wù)端首先會校驗登錄次數(shù)是否超過設(shè)置的閾值,如果超過只能繼續(xù)等待被關(guān)小黑屋。 如果未超過繼續(xù)登錄邏輯,判斷用戶名、密碼是否正確,不正確密碼則進(jìn)行閾值的判斷,如果超過則關(guān)小黑屋,記住小黑屋必須設(shè)置過期時間,要不然就會永久關(guān)上了,這個可以用redis的過期來做。 登錄成功后進(jìn)行后續(xù)的一切后置邏輯,比如加積分等操作。
手機(jī)號注冊登陸

首先輸入手機(jī)號,然后發(fā)送到服務(wù)端,服務(wù)端將手機(jī)號記錄在我們數(shù)據(jù)庫中,然后生成隨機(jī)驗證碼,并將手機(jī)號和驗證碼綁定到一個redis里面,然后記錄過期時間,這個過期時間一般是10分鐘左右,這就是我們一般手機(jī)驗證碼的有效期。 手機(jī)接收到手機(jī)短信后,那么就在界面填寫驗證碼發(fā)送服務(wù)端,服務(wù)端收到驗證碼后就會在redis里面查詢到這個手機(jī)號對應(yīng)的驗證碼,失敗就返回錯誤碼。 成功后就進(jìn)行登錄操作。
2. 數(shù)據(jù)庫設(shè)計

3. 引入第三方賬戶方案

客戶端自己調(diào)起登錄的界面,進(jìn)行輸入用戶名、密碼,這里的是第三方的用戶名,密碼,登錄成功后,會返回access_token openid expire_in,這過程會使用到oauth2.0,不過在sdk里面進(jìn)行內(nèi)置回調(diào)獲取了,后面我們會說明我們自身實現(xiàn)的oauth2.0 客戶端拿到access_token、openid、login_type(qq、wechat…)請求應(yīng)用服務(wù)器,應(yīng)用服務(wù)器拿到這些數(shù)據(jù)后就會根據(jù)對應(yīng)的login_type去對應(yīng)的用戶中心進(jìn)行access_token和openid進(jìn)行校驗。
校驗通過后就會判斷本地是否有這個login_type和openid是否存在,不存在則進(jìn)行獲取遠(yuǎn)程的用戶名、頭像等基礎(chǔ)信息來作為本地基礎(chǔ)數(shù)據(jù),并且返回code值 如果已經(jīng)存在,那就是進(jìn)行登錄操作,返回code值。 客戶端拿到code值后進(jìn)行token值的換取,這個完全遵照oauth2.0的協(xié)議來走的,后續(xù)每次請求必須帶上token,token值在服務(wù)端的時間比較久,因為我們想要做的是那種永不下線的操作,所以每次請求我們都將token過期時間進(jìn)行累加。
4. 數(shù)據(jù)庫設(shè)計




users表只是單純針對我們業(yè)務(wù)側(cè)的登錄,主要是做自身業(yè)務(wù)的oauth2.0業(yè)務(wù), user_local_auth是做自己用戶名、密碼登錄,手機(jī)號碼登錄信息記錄, user_third_auth是我們第三方用戶體系的數(shù)據(jù)記錄, user_auth_rel是用來關(guān)聯(lián)我們users表與user_local_auth、user_third_auth。 整個設(shè)計理念就是將自建用戶與第三方在存儲上區(qū)分,這在架構(gòu)演進(jìn)上也是合乎情理的,開始用戶體系大多自建,而后才是對外接入。
5. 總結(jié)
往期推薦
評論
圖片
表情
