[英]How to deal with session timeout (or expired token), when there is no routing on link in angular 4
對於過期令牌,我有一個非常常見的情況,如下所示,Kindle會協助我處理該問題。
我的應用程序會話是30分鍾,現在讓我們說,我在一頁上的時間超過30分鍾,然后單擊任何其他頁面鏈接。 因此它將重定向到登錄頁面。 在這里,通過路由重定向,以便主動防護出現在圖片中,並檢查令牌是否已過期,然后重定向到登錄頁面。 到目前為止看起來還不錯。 它工作正常。
但是,可以說,我在僅刷新表記錄的頁面上有一個刷新鏈接(通過調用new get http請求來刷新表記錄)(而不是刷新整個頁面)。 如果我在同一頁面上的時間超過30分鍾,然后單擊“刷新”按鈕,則如何檢查令牌是否過期。 因為在此刷新方案中未使用路由,所以不會主動保護令牌是否已過期。
您能否指導我如何處理該用例。
提前致謝 !!!
在您的CanActivate
路由防護器內部,您可能會返回Promise<boolean>
或Observable<boolean>
或boolean
。
但是在同一個保護文件中,您可能還依賴於根據令牌是否到期而返回true
或false
的服務。 這反過來又會使您從警衛隊返回。
假設AuthService正在檢查Auth令牌是否已過期。 數據服務正在為您獲取數據。
現在,在刷新此數據之前,可以通過以下方式再次進行檢查:將AuthService作為依賴項注入到DataService中,然后檢查令牌是否已過期。
或者 ,您的API可以檢查此請求是否已通過身份驗證。 為此,它要求您隨每個請求發送一個授權標頭。 在這種情況下,您可以使用HttpInterceptor
。 該攔截器將攔截每個傳出的請求,以檢查其上是否存在Authorization
標頭。 如果存在,則只有這樣才能允許請求繼續進行。 如果沒有,您可以通過將用戶導航回到登錄頁面來完成必要的工作。
在我們的環境中,為了提供最佳的UX,在會話到期時不會將用戶重定向到登錄頁面。
相反,整個頁面模糊不清,並且顯示了一個模態,該模態需要輸入密碼並包含如上所述的提交按鈕。
這種方法的主要優點是:
類似於此處描述的一些答案-https: //ux.stackexchange.com/questions/7195/best-practices-for-warning-of-session-expiration
如何在Angular中實現呢?
new Date() + 30 minutes.
authentication.service.ts
,它將在其構造函數中具有setInterval(() => checkSessionTimeout(), eg every 1 minute)
。 這種方法將確保該方法也可以在新的標簽/窗口上運行。 checkSessionTimeout()
,該方法輸出直到會話超時還剩下多少分鍾,並將其寫入authentication.service.ts
的變量中,例如sessionTimeoutIn: number;
<app-re-authenticate-modal *ngIf="authenticationService.sessionTimeoutIn <= 0"></app-re-authenticate-modal>
在應用程序級別注入此組件 [class.blur]="authenticationService.sessionTimeoutIn <= 0"
將類添加到您的主體/主體 <div *ngIf="authenticationService.sessionTimeoutIn > 0 && authenticationService.sessionTimeoutIn <= 2"></div>
: 在這些之后,用戶除了重新認證之外應該不能嘗試做其他任何事情,並且您仍然可以使用AuthenticationGuards。
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.