2017-07-26 146 views
0

我正在用JWT構建我的第一個API。我正在使用這個樣板項目:https://github.com/krisanalfa/lumen-jwt在Laravel上使用JWT刷新令牌的流程流明

我設法使它工作正常,但我有一個很大的問題:用戶令牌在一段時間後過期,將用戶從應用程序中註銷。我已閱讀該項目的文檔,致電/api/auth/refresh刷新令牌,但現在看來它有兩個主要缺點:

1)您必須製作一個只需要調用API來刷新令牌,我會想象你需要設置一個計時器來每隔X分鐘(令牌到期時間)調用它。

2)如果用戶關閉計算機3小時,當他重新打開計算機時,令牌已經過期,導致刷新不可用,並將用戶關閉。

由於我是新手,我錯過了什麼?我怎樣才能使令牌刷新週期工作沒有這些缺點?

回答

1

考慮你的兩點。

1)您可以使令牌僅適用於單次使用,但使用黑名單功能。然而這不是完全必要的。

在我自己的項目中,我給了令牌5分鐘過期,但我也將jwt-refresh中間件應用到了我的已認證路由(包裝在路由組中),以便每個請求都返回一個新令牌。

2)你也可以指定一個刷新到期,這是在此期間到期的令牌可以被驗證的窗口。這通常比令牌長得多。我用了14天。

因此,如果用戶離開您的網站3小時後又回來,他們的代幣將會過期。但是,您的應用程序應嘗試在後臺刷新該令牌,然後重新嘗試原始請求。

給出一些思考相應令牌生命期的明顯安全含義。 5分鐘是被濫用的短時間窗口,但如果過期的令牌可以刷新長達14天,則會增加風險,除非您將其列入黑名單。

+0

我試圖做到這一點,但顯然當我呼叫Refresh時,Dingo正在檢查令牌有效性,並且我仍然收到消息:「令牌已過期」。任何想法可能發生什麼? – raphadko

+0

這是因爲刷新路徑'api.auth.refresh'位於'api.auth'中間件組中。所以中間件在它到達控制器路由之前正在檢查有效性。如果你將它移到外面,它可能會起作用。 – fubar

+0

我正在使用jwt.refresh中間件,對第一個請求很好,然後我無法讀取響應中的新令牌。當我做console.log(request.getAllResponseHeaders());它不顯示令牌,只顯示「Content-Type:application/json Cache-Control:private,must-revalidate」。任何想法如何閱讀它? – raphadko