摘要:我的博客上一篇博客文章介紹了使用開發(fā)的幾個步驟,那么在實(shí)際操作中,我們需要測試設(shè)置了這幾個路由,對應(yīng)的類似這樣使用來調(diào)試這些。檢查此次請求中是否帶有,如果沒有則拋出異常。
我的github博客:https://zgxxx.github.io/
上一篇博客文章https://segmentfault.com/a/11... 介紹了laravel使用dingo+jwt開發(fā)API的幾個步驟,那么在實(shí)際操作中,我們需要測試API
$api = app("DingoApiRoutingRouter"); $api->version("v1", ["namespace" => "AppHttpControllersV1"], function ($api) { $api->post("register", "AuthController@register"); $api->post("login", "AuthController@login"); $api->post("logout", "AuthController@logout"); $api->post("refresh", "AuthController@refresh"); $api->post("me", "AuthController@me"); $api->get("test", "AuthController@test"); });
設(shè)置了這幾個路由,對應(yīng)的url類似這樣:http://www.yourweb.com/api/me 使用postman來調(diào)試這些API。
請求API的大致流程我們使用jwt代替session,首先是通過登錄(jwt的attempt方法驗證賬號密碼),成功后會返回一個JWT,我們把這個字符串統(tǒng)一叫做token,這個token需要我們客戶端保存起來,然后后面需要認(rèn)證的接口就在請求頭里帶上這個token,后臺驗證正確后就會進(jìn)行下一操作,如果token錯誤,或者過期就返回401或500錯誤,拒絕后面的操作。
前端可以保存在localStorage,小程序可以 使用wx.setStorageSync保存
所以請求頭信息Authorization:Bearer + token很重要,但是有個問題,這個token是有一個刷新時間和過期時間的:
"ttl" => env("JWT_TTL", 60),
"refresh_ttl" => env("JWT_REFRESH_TTL", 20160),
refresh_ttl是過期時間,默認(rèn)14天,很好理解,就像一些網(wǎng)站一樣,你好幾個月沒去登錄,你的賬號會自動退出登錄,因為過期了,需要重新輸入賬號密碼登錄。
ttl刷新時間默認(rèn)60分鐘,也就是說你拿這個一小時前的token去請求是不行的,會報The token has been blacklisted的錯誤,意思是說這個舊的token已經(jīng)被列入黑名單,無法使用
token是會被別人盜取的,所以token需要每隔一段時間就更新一次
這時候有個問題,每隔一小時就更新,那豈不是要每小時就重新登錄一遍來獲取新token?當(dāng)然不需要,我們可以寫個中間件來實(shí)現(xiàn)無痛刷新token,用戶不會察覺我們已經(jīng)更新了token。
checkForToken($request); // 使用 try 包裹,以捕捉 token 過期所拋出的 TokenExpiredException 異常 try { // 檢測用戶的登錄狀態(tài),如果正常則通過 if ($this->auth->parseToken()->authenticate()) { return $next($request); } throw new UnauthorizedHttpException("jwt-auth", "未登錄"); } catch (TokenExpiredException $exception) { // 此處捕獲到了 token 過期所拋出的 TokenExpiredException 異常,我們在這里需要做的是刷新該用戶的 token 并將它添加到響應(yīng)頭中 try { // 刷新用戶的 token $token = $this->auth->refresh(); // 使用一次性登錄以保證此次請求的成功 Auth::guard("api")->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()["sub"]); } catch (JWTException $exception) { // 如果捕獲到此異常,即代表 refresh 也過期了,用戶無法刷新令牌,需要重新登錄。 throw new UnauthorizedHttpException("jwt-auth", $exception->getMessage()); } } return $next($request)->withHeaders([ "Authorization"=> "Bearer ".$token, ]); } }
一旦中間件檢測到token過時了,就自動刷新token,然后在響應(yīng)頭把新的token返回來,我們客戶端可以根據(jù)響應(yīng)頭是否有"Authorization"來決定是否要替換token
在使用postman調(diào)試這些API的時候就有個問題,postman又沒有前端代碼,我怎么及時更新這個token,難道每次請求都要去看響應(yīng)頭,發(fā)現(xiàn)Authorization后手動去復(fù)制黏貼嗎,當(dāng)然也不需要,postman有個強(qiáng)大的環(huán)境變量,其實(shí)也是前端js的東西。
首先點(diǎn)擊設(shè)置環(huán)境這個按鈕,點(diǎn)擊Add按鈕添加一個變量,我們設(shè)置key值為access_token,
接著我們在登錄接口的Tests中去賦值這個變量
var data = JSON.parse(responseBody); if (data.result.access_token) { tests["Body has token"] = true; var tokenArray = data.result.access_token.split(" "); postman.setEnvironmentVariable("access_token", tokenArray[1]); } else { tests["Body has token"] = false; }
這段js代碼就是獲取請求成功后返回的access_token值,將其賦值給postman的環(huán)境變量,我們看到請求成功后我們后臺返回了一個json,其中就有我們需要的access_token,我們可以再去環(huán)境變量那里看看這時候的變量有什么變化
可以看到這里的變量access_token已經(jīng)有值了,就是我們后臺返回來的access_token字符串,說明賦值成功
接著我們到另一個需要認(rèn)證的接口測試
我們在Authorization類型type選擇Bearer Token,在后面Token表單那里打一個"{"就會自動提示我們設(shè)置過的變量{{access_token}}
發(fā)送請求測試下
已經(jīng)成功了。
那如果token刷新了,經(jīng)過后臺中間件無痛刷新后,會在響應(yīng)頭返回一個新的token(這一次請求用的是舊的token,默認(rèn)認(rèn)證通過)
現(xiàn)在我們需要在這個接口上直接更新我們的變量access_token(如下圖),而不需要去再請求一遍登錄接口
var authHeader = postman.getResponseHeader("Authorization"); if (authHeader){ var tokenArray = authHeader.split(" "); postman.setEnvironmentVariable("access_token", tokenArray[1]); tests["Body has refreshtoken"] = true; } else { tests["Body has no refreshtoken"] = false; }
這段js代碼就是將響應(yīng)頭中的Authorization賦值給我們的access_token
這是響應(yīng)頭的Authorization,截取了最后面的字符串
刷新時間過了后,我們試著再發(fā)一次請求,我們可以看到,還是可以訪問的,而且請求頭里的Authorization已經(jīng)自動更新過來了
用一句話整理大概就是,你需要在哪個接口響應(yīng)后更新變量,就去這個這個口的Test下寫js賦值代碼
postman.setEnvironmentVariable("access_token", token);,只要沒錯誤你就可以在別的地方使用{{access_token}}更新替換了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29629.html
showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區(qū)優(yōu)秀文章 Laravel 5.5+passport 放棄 dingo 開發(fā) API 實(shí)戰(zhàn),讓 API 開發(fā)更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...
摘要:花了將近兩個星期完成了功能,期間我編寫的能力也算是有所提升了。所以能看到這篇文章的同學(xué)都是大佬如果想看更多的原創(chuàng)技術(shù)文章,歡迎大家關(guān)注我的微信公眾號??赡芨信d趣的鏈接文章的目錄導(dǎo)航微信公眾號端文章的目錄導(dǎo)航端海量精美腦圖 前言 只有光頭才能變強(qiáng) 2018年8月30日,今天我辭職了。在6月25號入職,到現(xiàn)在也有兩個月時間了。 感受: 第一天是期待的:第一次將項目拉到本地上看的時候,代碼...
摘要:前言由于在度娘找了半天根本一大堆版本,弄得我死去活來的,每個都試了一堆問題,到底你們做完有沒有總結(jié)過一次然后有幾個使用,完全不行啊,太監(jiān)版不是我想要的。后來,終于找到例子并實(shí)測成功。 前言 由于在度娘找了半天根本一大堆Copy版本,弄得我死去活來的,每個都試了一堆問題,到底你們做完有沒有總結(jié)過一次?然后有幾個使用lunmen+dingo api+jwt,完全不行啊,太監(jiān)版不是我想要的。...
摘要:它主要是用來模擬各種請求的如等等與瀏覽器的區(qū)別在于有的瀏覽器不能輸出格式而更直觀接口返回的結(jié)果。 Postman測試工具調(diào)試接口詳細(xì)教程 簡介 Postman,...
摘要:則是目前比較成熟的一套互聯(lián)網(wǎng)應(yīng)用程序的設(shè)計理論。則允許操作,不一樣,報錯返回或者加入黑名單。再看下我們的數(shù)據(jù)庫中的用戶信息,值也被存入了進(jìn)來,便于我們之后進(jìn)行權(quán)限驗證。訪問同時將我們的值在中以傳入正確獲得用戶名則表示我們訪問請求通過了驗證。 showImg(https://segmentfault.com/img/remote/1460000008629635?w=800&h=534)...
閱讀 2138·2021-09-27 14:04
閱讀 1883·2019-08-30 15:55
閱讀 1707·2019-08-30 13:13
閱讀 1076·2019-08-30 13:07
閱讀 2754·2019-08-29 15:20
閱讀 3247·2019-08-29 12:42
閱讀 3345·2019-08-28 17:58
閱讀 3606·2019-08-28 17:56