您好,登錄后才能下訂單哦!
本篇內容主要講解“什么是Token機制”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“什么是Token機制”吧!
互聯網發展到現在已經到了一個非常成熟的時代,所以不再是一個你寫一個靜態網站就可以進行瘋狂盈利的時代了。現在對產品有著很多的要求,健壯性,安全性這些都是必不可少的。前兩篇也說過了現在公司一般用戶登錄成功會給前端返回token,前端訪問接口請求數據需要攜帶token進行身份驗證。我們一直說token,那究竟什么是token?token其實就是一個令牌,是服務端生成的一串字符串,解析可以得到用戶信息。
因為HTTP是一種無狀態協議,所以是沒辦法記住用戶的登錄狀態的。所以客戶端每次請求都需要驗證身份,最早的解決方案是:當用戶請求登錄成功,在服務端生成一條記錄,然后把記錄id發送給客戶端,客戶端收到以后把這個id存儲在cookie里,下次該用戶再次向服務端發送請求的時候,可以帶上這個cookie,這樣服務端會驗證一下cookie里的信息,看能不能在服務端這里找到對應的記錄,如果可以,說明用戶已經通過了身份驗證,就把用戶請求的數據返回給客戶端。其實這種方案就是利用session,id值其實就是sessionid。那我們既然可以使用session進行身份驗證,我們為什么還要選擇使用token呢?
1.session是需要空間進行存儲的,如果是多服務器session需要同步信息,但是token在服務器是可以不需要存儲用戶信息的。
2.token可以使用瀏覽器的localStorge等,APP也可以使用自帶數據庫存儲字符串。且不會出現cookies出現跨域問題。
3.token可以用JWT來攜帶部分不太敏感的信息比如用戶ID等,服務器只要解密token即可使用部分信息。
使用token驗證機制講完了,那我們需要知道我們使用token驗證的整個流程:
1.當用戶登錄成功之后, 服務器端就會通過指定算法生成一個 token,過期時間48h,可以將token 存儲在redis,再將這個token值返回給客戶端;
2.客戶端拿到 token 值之后,進行保存;
3.當客戶端調用接口請求數據時,就會攜帶 token 值發送給服務器;
4.服務器接收到客戶端的請求之后,會取出token值與保存在redis中的token值做對比。
5.如果token對比成功,說明用戶處于登錄狀態,否則表示登錄狀態失效,需要用戶重新登陸。用戶每次重新登陸會刷新token的過期時間。
接下來我們用代碼來走一趟整個流程:
首先我們實現登錄邏輯,這套沒什么好講的,可以去看看一篇文章:你不知道的前后端分離之交互(2)
用戶首次登錄去數據庫匹配賬號密碼,匹配成功會返回用戶唯一標識uid,account這些基本數據。接下來我們需要去使用指定算法生成一個token
我們通過用戶app_sid以及account生成一個簡單的token:TKN:3:Q:d:8zTEiTJEJ7dee:AOK_H5,然后去redis查詢以這個簡單token為鍵值的token是否存在。
如果用戶token已存在redis中,則刪除這個token。然后生成新的token。
將新token存儲到redis中,一樣采用鍵名為簡單token,鍵值為最終生成的token。過期時間設置成48h。
到這里我們生成token的操作就全部完善了。基本流程就是用戶登錄成功會以app_sid和account先生成一個簡單token,去redis查詢該token是否存在。存在則刪除token,然后使用特定算法將簡單token轉化成最終的token存儲到redis。然后給前端返回token進行存儲。
可以看到我們成功將token返回給前端了。現在我們還需要一個驗證token的接口。因為我們直接將token存儲在redis中,所以接收到前端傳的token,我們可以直接去redis中查詢token是否存在,如果token存在,則代表用戶處于登錄狀態,給前端返回數據。否則登陸失敗,提示請先登錄。
前端每次請求通用數據接口的時候,先驗證token的有效性。這樣整套下來我們就可以實現基于token的權限驗證。但是這套邏輯是有缺點的,因為我們使用token理論上服務端可以不進行存儲,直接指定加解密算法,我這里由于生成token使用的隨機算法,無法反向解密,所以只能存儲在redis中進行處理。其實我覺得更好的方案是直接設計加解密算法,服務端使用加密算法生成token返回給前端,前端每次請求通用數據接口攜帶token,服務端直接接收前端的token進行反向解密,如果解密成功則可以得到用戶的uid等基本信息,解密失敗則提示前端請先登錄。
到此,相信大家對“什么是Token機制”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。