技術(shù)匯總:第十六章:關(guān)于登錄與退出的token

當兩個設(shè)備都操作登錄時,后操作的設(shè)備將具備登錄權(quán)限,而之前登錄的設(shè)備失去登錄權(quán)限。

通常的登錄業(yè)務(wù),按照 token 隨機生成的話,不同設(shè)備擁有不同的 token ,根據(jù) token 來作為 key 保存登錄數(shù)據(jù),是可以同時登錄同一個帳號,并且都保持在線的。因為這些 token 里面如果存登錄狀態(tài)的話,都會是已登錄模式。

既然有這個唯一設(shè)備登錄的需求,那就單獨設(shè)置一個 user_login 的規(guī)則好了,比如 @caola 提供的方案, token 記錄會話數(shù)據(jù), userid 記錄最后登錄的 token ,這樣只要有新請求過來,拿它的 token 以及 userid 里面存的 token 比較,不一致,就說明此登錄已失效。

將用戶輸入的 賬號和密碼 提交給服務(wù)器;
服務(wù)器對其進行校驗,若賬號和密碼對得上則校驗通過,說明登錄成功,并生成一個token值,將其保存在數(shù)據(jù)庫,同時也返回給客戶端;
客戶端拿到返回的token值后,可將其保存在本地,作為公共參數(shù),即以后每次請求服務(wù)器時都攜帶該token,提交給服務(wù)器,讓服務(wù)器校驗。
服務(wù)器接收到請求后,會取出請求頭里的token值與數(shù)據(jù)庫存儲的token進行對比校驗。若兩個token值相同,則說明用戶登錄成功過,且當前正處于登錄狀態(tài),此時正常返回數(shù)據(jù),讓APP顯示數(shù)據(jù)。若兩個值不一致,則說明原來的的登錄已經(jīng)失效,此時返回錯誤狀態(tài)碼,提示用戶跳轉(zhuǎn)至登錄界面重新登錄。用戶每進行一次登錄,登錄成功后服務(wù)器都會更新個token新值返回給客戶端。


個人觀點:

我想用 { token: userId } 的形式將登錄后產(chǎn)生的 token 保存在 redis 中,當用戶使用 token 登錄時就根據(jù) token 來找出對應(yīng)的 id ,但是這樣在用戶重新登錄(比如換個設(shè)備,之前沒退出)時,清除之前保存的 token。

token找到userId,換設(shè)備登錄的時候清除之前的token或者重新利用,觀點僅供參考:
1、你的情況可能是token存在了本地,不想暴露任何用戶信息,包括id,所以你生成的token作為key中肯定不包含任何的用戶信息,目的就是為了通過token找到id,然后再查詢出用戶信息,像這種情況我目前也只是想到通過redis本身的有效期來清除這些,token的作用可以理解為一個session
2、另外一種情況,我自己就會通過本地存儲的token+device_token(設(shè)備號)通過各種加密方式產(chǎn)生一個key,假如是同一個設(shè)備又沒有過期的情況下可以反復(fù)使用

 

前后端分離

    首次登錄時,后端服務(wù)器判斷用戶賬號密碼正確之后,根據(jù)用戶id、用戶名、定義好的秘鑰、過期時間生成 token ,返回給前端;
    前端拿到后端返回的 token ,存儲在 localStroage 和 Vuex 里;
    前端每次路由跳轉(zhuǎn),判斷 localStroage 有無 token ,沒有則跳轉(zhuǎn)到登錄頁,有則請求獲取用戶信息,改變登錄狀態(tài);
    每次請求接口,在 Axios 請求頭里攜帶 token;
    后端接口判斷請求頭有無 token,沒有或者 token 過期,返回401;
    前端得到 401 狀態(tài)碼,重定向到登錄頁面。