如何設計使用者登入

來源:互聯網
上載者:User

標籤:

在Web系統中,使用者登入是最基本的功能。要實現使用者名稱+密碼登入,很多同學的第一想法就是直接建立一個Users表,包含username和password兩列,這樣,就可以實現登入了:

 id | username | password | name等其他欄位----+----------+----------+---------------- A1 | bob      | a1b23f2c | ... A2 | adam     | c0932f32 | ...

現在問題來了,如果要讓使用者通過第三方登入,比如微博登入或QQ登入,怎麼整合進來呢?

以微博登入狀態例,由於微博使用OAuth2協議登入,所以,一個登入使用者會包含他的微博身份的ID,一個Access Token用於代表該使用者訪問微博的API和一個到期時間。

要整合微博登入,很多童鞋立刻想到把Users表擴充幾列,記錄下微博的資訊:

 id | username | password | weibo_id | weibo_access_token | weibo_expires | name等其他欄位----+----------+----------+----------+--------------------+---------------+---------------- A1 | bob      | a1b23f2c | W-012345 | xxxxxxxxxx         | 604800        | ... A2 | adam     | c0932f32 | W-234567 | xxxxxxxxxx         | 604800        | ...

加一個QQ登入Users表就又需要加3列,如果這麼擴充下去,改表都得累死,不要說維護代碼了。

那怎麼才能設計出靈活的登入呢?

不妨換個角度考慮使用者登入。當使用者以任意一種方式登入成功後,我們讀取到的總是Users表對應的一行記錄,它實際上是使用者的設定檔(Profile),而登入過程只是為了認證使用者(Authenticate),無論是本地用密碼驗證,還是委託第三方登入,這個過程本質上都是認證。

所以,如果把Profile和Authenticate分開,就十分容易理解了。Users表本身只儲存使用者的Profile:

 id | name | birth等其他欄位----+------+----------------- A1 | Bob  |  ... A2 | Adam | ...

而通過使用者名稱口令登入可視為一種Authenticate的方式,利用LocalAuth表維護:

 id | user_id | username | password----+---------+----------+----------- 01 | A1      | bob      | a1b23f2c 02 | A2      | adam     | c0932f32

通過微博登入可視為另一種Authenticate方式,利用OAuth表維護:

 id | user_id | weibo_id | weibo_access_token | weibo_expires----+---------+----------+--------------------+--------------- 11 | A1      | W-012345 | xxxxxxxxxx         | 604800 12 | A2      | W-234567 | xxxxxxxxxx         | 604800

如果要添加另一種OAuth登入,比如QQ登入,增加一個表就可以了。不過既然大家都是OAuth家族的,不如統一到一個表,給每家起個名字區分就好了:

 id | user_id | oauth_name | oauth_id | oauth_access_token | oauth_expires----+---------+------------+----------+--------------------+--------------- 11 | A1      | weibo      | W-012345 | xxxxxxxxxx         | 604800 12 | A2      | weibo      | W-234567 | xxxxxxxxxx         | 604800 13 | A1      | qq         | Q-090807 | xxx-xxx-xxx        | 86400 14 | A2      | qq         | Q-807060 | xxx-xxx-xxx        | 86400

如果要增加一種新的登入方式,比如SAML,那就再加一種類型的表。

有些網站需要API訪問,API可以使用api_key和api_secret來認證,可是怎麼把一個API訪問關聯到一個使用者?方法還是增加一種API Auth的表:

 id | user_id | api_key  | api_secret----+---------+----------+------------ 11 | A1      | a-012345 | xxxxxxxxxx 12 | A2      | a-234567 | xxxxxxxxxx

每一種X-Auth表都儲存了使用者的登入認證資訊,並通過user_id關聯到Users表。這樣一來,不但登入過程簡化了,而且一個使用者可以使用多種方式登入。只要登入成功,拿到了user_id,最後讀取Users表是為了獲得使用者的Profile,這樣讀出來的資料也更安全,因為Users表不包含使用者口令,不會因為暴露API而不小心把口令給泄露出去。

 

如何設計使用者登入

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.