登錄及jwt(json+web+token)鑒權
Web的登錄鑒權方式(cookie base):
HTTP的特性:短連接、是無狀態的、每次發送的請求都是新的,服務器無法知道每次請求是哪個用戶發送的?那么如何才能知道每次發送的請求是哪個用戶發送的呢? --- 通過session實現
(客戶端)
client(web) ------------>server
(服務端)
網站調用登錄接口傳入username、password 到達服務器端此時服務器會鑒權,鑒權通過此時服務器會產生一個session,此時這個session是有一個sessionid的,然后服務器將這個session加密后通過set-cookie的方式發送給客戶端(從cookie里面發送,一串類似指紋的token)客戶端把token解出來以后可以知道在服務端對應的sessionid是哪一個,之后每一次發送的請求都會帶上cookie,cookie里面的信息是token,服務器看到token以后會把token和session進行關聯起來。這樣服務器就可以知道那個用戶登錄了,用戶是誰。登錄態是在cookie中,清掉cookie需要重新登錄。cookie是存在哪里呢?--瀏覽器中
App的登錄鑒權方式(token base):
(客戶端)
client(app) ------------>server
(服務端)
通過服務器發送一個數據:本地存文件-類似cookie方式
服務器端會實現一套cookie過期機制,這個方法並不簡單。那么有沒有什么更簡單的辦法呢?
一個請求(包含username/password)發送給服務器,服務器會鑒權,這時候沒有session這時候通過username/password知道哪個用戶登錄,然后將用戶信息加密(加密成一個token-類似字符串)然后把token發送給客戶端-客戶端把token保存起來,之后每一次發送服務端的請求都帶上token,服務器端收到token以后可以通過token反解出來這個用戶是誰?及過期時間,比如token是否在過期時間之內,如果已經超過過期時間就實效了,在發送一個新的token給我。
這種方式的優勢和劣勢:
在服務器端沒有開任何的session,沒有什么空間開銷,撐得用戶數會多一些。但是解token會占用cpu,消耗時間。
思考一個問題:http請求通過什么方式把token發到服務器?
一般把token放到header中發送到服務器 。在訪問需要鑒權的接口時,我們將token放到http請求的header中,如果該token是有效的,那么接口正常返回,否則接口返回401錯誤。
實 現
POST /login username/password這個接口提供了登錄功能。
如果username和password組合是正確的,該接口將返回如下的信息
- id: 登錄用戶的id
- username: 登錄用戶的用戶名
- token: 用戶登錄的憑證,登錄之后,所有的后續請求都必須包含該token。
{ "id":2, "username":"admin", "token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWQiOjIsImlhdCI6MTQ3MzQ5Nzc1MCwiZXhwIjoxNTU5ODk3NzUwfQ.CkxZAESKLNVu8FOOkxqdbpBukl2FFteAvPWOQulXPgc" }
1.我們將注冊的API接口停掉,避免每次都注冊。因為我們要驗證的是登錄接口。我們現在取一個注冊已經好的用戶名和密碼登錄系統user_251,user251,如下圖所示:
2.運行結果后,查看結果樹查看我們發送的請求是否發送成功,返回token是否成功。
如上圖所示,我們登錄接口發送的請求成功,並且返回了一個token這個token是加密過得。那么我們接下來如何獲取這個token的值呢呢?當熱,我們可以通過變量的方式獲取token的值,具體請看下面的操作。
3.我們在登錄請求右鍵---添加--后置處理器--選擇json extractor 方式來獲取token的值
4.在json extractor中需要進行如下設置,我們在variablenames中設置一個變量名,方便后面引用這個變量名,然后獲取token的值$.token代表的是從根下面取第一個token值,找不到就報錯:NOT FOUND
我們設置的變量名token,獲取這個token變量的目的是方便在后面使用,很重要哦!所以,先暫時介紹到這里。我們繼續聊正題!
5.設置完成后,我們需要做登陸后的斷言,沒有斷言的接口測試是不嚴謹的。這里我們使用jmeter提供給我們的“響應斷言”,因為這種的方式比較簡單,好理解,也能解決實際問題。如圖所示,我們添加一個響應斷言:
6.響應斷言里面參數設置如下圖所示:
7.驗證斷言是否成功,我們再次運行登陸接口請求API。