用戶郵箱驗證明現思路

用戶郵箱驗證明現思路

最近在作個網站的後臺,使用了JWT 實現了用戶驗證,並在這個基礎上實現用戶郵箱驗證。對於 JWT 的原理,本文將不會涉及太多,若是你不是很懂 JWT,建議你弄懂了再看這篇文章。

JWT 實現用戶登陸

在說郵箱驗證以前,先簡單講下 JWT 是如何實現用戶驗證的。數據庫

當用戶登陸時,驗證完用戶名和密碼後,將 uid(用戶id)和 iat(該 JWT 建立時間) 放入到 playload 中,使用密鑰生成簽名,最後組成 JWT,發送給客戶端。客戶端把這個 token 存在 localStorage 或 cookies 中。cookie

客戶端每次發起須要權限的請求,都會攜帶這個 jwtToken。後臺對 jwtToken 進行校驗,發現沒問題,則取出 jwt 的 payload 裏的內容(注意 jwt 的一個優勢是不須要數據庫)。經過計算 iat 的時間加上後臺設置的有效期是否大於當前時間來判斷 token 是否過時,沒過時就把 uid 保存在請求對象中。若是 token 沒經過驗證,則沒法繼續後面須要權限的操做。網站

添加郵箱驗證功能

場景

用戶註冊帳戶(填寫用戶名、密碼、郵箱)後,會發送一封郵件給用戶的郵箱。郵件裏面有個連接,用戶點擊後,郵箱就被驗證了。用戶若是沒有進行驗證的話,是不容許一些操做的,如發表文章(防止惡意註冊用戶)。ui

流程圖

圖片描述

實現

下面就開始介紹實現過程。spa

首先,用戶第一次註冊的時候,在 user 表中建立了用戶信息後,給客戶端返回一個前面說到的 jwtToken。但這個 jwt 的 payload 要添加多一個屬性 unAuthEmail,並設置爲 true, 說明當前用戶沒有進行郵箱驗證。code

與此同時咱們還要將生成的 用戶id 存儲到要給一個名爲 unAuthEmailUser(沒有進行郵箱驗證的用戶表) 的表中。jwt

unAuthEmailUser 表主要是記錄沒有進行郵箱驗證的用戶id,固然你也能夠在 user 表中加個表字段來記錄,不過我考慮到不進行郵箱驗證的用戶不會太多,就獨立出這個個表了(以爲大概能提高查錶速度)。對象

對於郵箱驗證,咱們也須要一個 token(爲了和前面的驗證用戶token進行區分,咱們在這裏將它稱爲 emailToken)。這裏我也使用了 jwt 的方式,密鑰能夠用和前面相同的,也能夠用新的。payload 部分,須要放置 uid 和 iat。生成 emailToken 後,將它做爲 驗證鏈接的 token 的值。如blog

https://yoursite.com/emailVerification?token=2f1f4cee1f0.c94560a75cc3b.6347f45ab

而後後臺會將發送一封郵件給用戶的郵箱(須要查詢 user 表得到郵箱地址),裏面附有這個郵箱驗證連接。token

用戶點擊這個連接,就向 /emailVerification 路由傳遞了一個 token 參數。若是 Emailtoken 經過了驗證,且沒有過時(此次設置的過時時間要短點),將 unAuthEmailUser 含有對應 uid 的數據刪除。這時候生成一個新的不含 unAuthEmail 的用戶驗證用的 Token 發送給客戶端(代表當前用戶已經進行過郵箱驗證了)

用戶每次登錄生成 token 的時候,都要查詢 unAuthMailUser 表,若是有該用戶,返回的 token 中須要有 unAuthMail=true,不然不帶該屬性。

另外,用戶還能夠經過點擊 「發送郵箱驗證郵件」 按鈕,生成 emailToken 發到你的郵箱。

總結

用戶驗證 token 和郵箱 token 都使用了 JWT。咱們建立了一個表來保存未進行郵箱驗證的,用戶每次生成用戶身份驗證用的 token 都要查詢這個表。若是表中包含當前用戶id,說明未進行郵箱驗證,token 須要添加 unAuthMail: true;不然不添加這個屬性。點擊驗證連接進行驗證時,若是 token 有效,移除 unAutnMailUser 表中的對應用戶id,並生成一個新的不含 unAuthMail 的 token 替換掉原來客戶端保存的舊 token。

相關文章
相關標籤/搜索