国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

API 開發中可選擇傳遞 token 接口遇到的一個坑

siberiawolf / 1310人閱讀

摘要:此處做刷新處理具體代碼可以參考必須需要登錄驗證的接口在響應頭中返回新的問題解決。

在做 API 開發時,不可避免會涉及到登錄驗證,我使用的是jwt-auth

在登錄中會經常遇到一個token過期的問題,在config/jwt.php默認設置中,這個過期時間是一個小時,不過為了安全也可以設置更小一點,我設置了為五分鐘。

五分鐘過期,如果就讓用戶去登錄,這種體驗會讓用戶直接拋棄你的網站,所以這就會使用到刷新token這個功能

正常情況下是寫一個刷新token的接口,當過期的時候前端把過期的token帶上請求這個接口換取新的token

不過為了方便前端也可以使用后端刷新返回,直至不可刷新,我用的就是這個方法:使用 Jwt-Auth 實現 API 用戶認證以及無痛刷新訪問令牌

而坑就是這樣來的,

在必須需要登錄驗證的接口設置刷新token

checkForToken($request);

        try {
            /****************************************
             * 嘗試通過 tokne 登錄,如果正常,就獲取到用戶
             * 無法正確的登錄,拋出 token 異常
             ****************************************/
            if ($this->auth->parseToken()->authenticate()) {
                return $next($request);
            }
            throw new UnauthorizedHttpException("jwt-auth", "User not found");

        } catch (TokenExpiredException $e) {
            try {
                /****************************************
                 * token 過期的異常,嘗試刷新 token
                 * 使用 id 一次性登錄以保證此次請求的成功
                 ****************************************/
                $token = $this->auth->refresh();
                $id = $this->auth
                    ->manager()
                    ->getPayloadFactory()
                    ->buildClaimsCollection()
                    ->toPlainArray()["sub"];

                auth()->onceUsingId($id);
            } catch (JWTException $e) {
                /****************************************
                 * 如果捕獲到此異常,即代表 refresh 也過期了,
                 * 用戶無法刷新令牌,需要重新登錄。
                 ****************************************/
                throw new UnauthorizedHttpException("jwt-auth", $e->getMessage(), null, StatusServe::HTTP_PAYMENT_REQUIRED);
            }
        }

        // 在響應頭中返回新的 token
        return $this->setAuthenticationHeader($next($request), $token);
    }
}

而有些頁面,比如文章列表頁面,這個接口登錄與不登錄皆可訪問,不過登錄的時候可以在頁面上顯示是否點贊了這篇文章。所以這個接口直接使用的是jwt-auth默認的option中間件


 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace TymonJWTAuthHttpMiddleware;

use Closure;
use Exception;

class Check extends BaseMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     *
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->auth->parser()->setRequest($request)->hasToken()) {
            try {
                $this->auth->parseToken()->authenticate();
            } catch (Exception $e) {


            }

        }

        return $next($request);
    }
}

一開始也沒有發現問題,直到測試的時候,發現文章列表頁面點贊過的文章,過了一段時間再刷新的時候發現不顯示已點贊,但是進入個人中心的已點贊文章可以看到。

剛開始測試沒找出原因,直接暴力調試代碼,發現沒獲取到登錄用戶,一想不對呀,已經傳token為何獲取不到。經過發現,去到個人中心,再回到新聞列表頁就可以正常顯示,過了一段時間又不顯示了。

經過這一輪之后,大概明白,在新聞列表頁時,token已經過期,但是當時圖方便用的jwt-auth默認的中間件,不會刷新token,所以這個接口獲取不到登錄的用戶。當進入個人中心,發現當前token已經過期,后臺刷新token返回,這時候再回到文章列表頁就可以得到正常的數據,一段時間后,token又失效了,所以有無法看到點贊過的文章

解決方法,自己寫一個option中間件,當存在token的時候,也需要做token刷新處理。

auth->parser()->setRequest($request)->hasToken()) {
            try {
                $this->auth->parseToken()->authenticate();
            } catch (TokenExpiredException $e) {
                // 此處做刷新 token 處理
                // 具體代碼可以參考必須需要登錄驗證的接口
                // 在響應頭中返回新的 token
                return $this->setAuthenticationHeader($next($request), $token);
            } catch (Exception $e) {
            
            }

        }

        return $next($request);
    }
}

問題解決。
最后說一個并發會出現的問題:

# 當前 token_1 過期,先發起 a 請求,之后馬上發起 b 請求
# a 請求到服務器,服務器判斷過期,刷新 token_1
# 之后返回 token_2 給 a 請求響應
# 這時候遲一點的 b 請求用的還是 token_1 
# 服務器已經將此 token_1 加入黑名單,所以 b 請求無效
       token_1         刷新返回 token_2
a 請求 --------> server -------> 成功
       token_1         過期的 token_1,應該使用 token_2
b 請求 --------> server ------> 失敗

jwt-auth已經想到這種情況,我們只需要設置一個黑名單寬限時間即可

我設置為5秒,就是當token_1過期了,你還能繼續使用token_1操作5秒時間

原文地址

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/28900.html

相關文章

  • 使用 vue2.0 開發微信公眾號下前后端分離SPA站點之旅

    摘要:目前正在寫一個微信公眾號的小項目,記錄一下遇到的問題和解決方法主要是前端。前端提交時使用,在后端再取出對應的微信支付看了下文檔,以前是需要用喚起支付,而現在則是把微信內置到了微信的瀏覽器中。 目前正在寫一個微信公眾號的小項目,記錄一下遇到的問題和解決方法(主要是前端)。內容持續更新中~ 主要實現 前后端分離前端為 SPA 單頁面使用微信的JSSDK微信支付 技術方案 后端使用 php ...

    Taonce 評論0 收藏0
  • 使用 vue2.0 開發微信公眾號下前后端分離SPA站點之旅

    摘要:目前正在寫一個微信公眾號的小項目,記錄一下遇到的問題和解決方法主要是前端。前端提交時使用,在后端再取出對應的微信支付看了下文檔,以前是需要用喚起支付,而現在則是把微信內置到了微信的瀏覽器中。 目前正在寫一個微信公眾號的小項目,記錄一下遇到的問題和解決方法(主要是前端)。內容持續更新中~ 主要實現 前后端分離前端為 SPA 單頁面使用微信的JSSDK微信支付 技術方案 后端使用 php ...

    afishhhhh 評論0 收藏0
  • thinkphp3.2,微信JS-SDK開發過程中遇到各種問題與細節分享

    摘要:備注登錄后可在開發者中心查看對應的接口權限。下載官網提供的示例代碼,參照中的代碼一步一步來實現。否則分享后的頁面會簽名失敗返回的與分享的是否一致 首先完成官方文檔前兩步(很好理解就不具體說了):步驟一:綁定域名先登錄微信公眾平臺進入公眾號設置的功能設置里填寫JS接口安全域名。備注:登錄后可在開發者中心查看對應的接口權限。步驟二:引入JS文件在需要調用JS接口的頁面引入如下JS文件,(支...

    miya 評論0 收藏0
  • 分享一下這兩周爬微信支付~希望有借鑒作用(PHP)

    摘要:這個坑就是要注意回調結束要返回成功的響應這幾天做微信支付暫時遇到的問題就這么多,只能說注意細節吧,爬過的坑記錄下來以后遇到就懂處理了。 前言 其實任何接口開發只要按照給出來的接口文檔和例子開發基本上不會有太大問題的,一些問題都是出在雜七雜八的小細節上,現在分享一下微信支付開發中自己遇到的小細節。按照文檔做完開發前配置,比如JS安全域名配置、網頁授權域名、公眾號授權目錄等等... 坑一:...

    Tangpj 評論0 收藏0
  • node微信后臺開發初探

    摘要:今天看到了微信官方推出的一個瀏覽器插件,用來調試微信后臺和頁面的,挺好的。這個是根據別人的文章總結的,時間戳隨機數生成簽名將三者進行加密與簽名進行對比之后每次都會進行身份校驗。然而后面還有更深的坑。 原文摸索中遇到的一些坑,雖然很簡單,但新手還是會被坑到,就稍微記錄一下吧,也當學習手冊,最好去了解一下express,不是很難,這邊只是簡單的配置,更高級的接口還是去看文檔,模塊或者自己實...

    mingzhong 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<