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

資訊專欄INFORMATION COLUMN

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

siberiawolf / 1301人閱讀

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

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

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

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

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

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

而坑就是這樣來的,

在必須需要登錄驗證的接口設(shè)置刷新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);
            }
        }

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

而有些頁面,比如文章列表頁面,這個接口登錄與不登錄皆可訪問,不過登錄的時候可以在頁面上顯示是否點贊了這篇文章。所以這個接口直接使用的是jwt-auth默認(rèn)的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);
    }
}

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

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

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

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

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

        }

        return $next($request);
    }
}

問題解決。
最后說一個并發(fā)會出現(xiàn)的問題:

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

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

我設(shè)置為5秒,就是當(dāng)token_1過期了,你還能繼續(xù)使用token_1操作5秒時間

原文地址

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28900.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    mingzhong 評論0 收藏0

發(fā)表評論

0條評論

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