精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

無(wú)感刷新 Token:如何做到讓用戶(hù)“永不掉線”

開(kāi)發(fā)
出于安全考慮,用于身份驗(yàn)證的 Token?(通常是 Access Token)必須有較短的有效期。那么,我們?nèi)绾卧诒WC安全的前提下,創(chuàng)造一種“永不掉線”的絲滑體驗(yàn)?zāi)兀?/div>

沒(méi)有什么比在用戶(hù)操作得正嗨時(shí),突然提示“登錄已過(guò)期,請(qǐng)重新登錄”的提示更讓人沮喪的了。這種突兀的中斷不僅破壞了用戶(hù)體驗(yàn),甚至可能導(dǎo)致未保存的數(shù)據(jù)丟失。

然而,我們都知道,出于安全考慮,用于身份驗(yàn)證的 Token(通常是 Access Token)必須有較短的有效期。那么,我們?nèi)绾卧诒WC安全的前提下,創(chuàng)造一種“永不掉線”的絲滑體驗(yàn)?zāi)兀?/p>

問(wèn)題的根源:Access Token 的“天生矛盾”

首先,我們要理解為什么需要刷新 Token。

我們通常使用 Access Token 來(lái)驗(yàn)證用戶(hù)的每一次 API 請(qǐng)求。為了安全,Access Token 的生命周期被設(shè)計(jì)得很短(例如 30 分鐘或 1 小時(shí))。如果有效期太長(zhǎng),一旦泄露,攻擊者就能在很長(zhǎng)一段時(shí)間內(nèi)冒充用戶(hù)進(jìn)行操作,風(fēng)險(xiǎn)極高。

這就產(chǎn)生了一個(gè)矛盾:

  • 安全性要求:Access Token 有效期要短。
  • 用戶(hù)體驗(yàn)要求:用戶(hù)不想頻繁地被強(qiáng)制重新登錄。

為了解決這個(gè)矛盾,Refresh Token 應(yīng)運(yùn)而生。

核心理念:雙 Token 認(rèn)證系統(tǒng)

無(wú)感刷新機(jī)制的核心在于引入了兩種類(lèi)型的 Token:

(1) Access Token(訪問(wèn)令牌)

  • 用途:用于訪問(wèn)受保護(hù)的 API 資源,附加在每個(gè)請(qǐng)求的 Header 中。
  • 特點(diǎn):生命周期短(如 1 小時(shí)),無(wú)狀態(tài),服務(wù)器無(wú)需存儲(chǔ)。
  • 存儲(chǔ):通常存儲(chǔ)在客戶(hù)端內(nèi)存中(如 Vuex/Redux),因?yàn)樾枰l繁讀取。

(2) Refresh Token(刷新令牌)

  • 用途:當(dāng) Access Token 過(guò)期時(shí),專(zhuān)門(mén)用于獲取一個(gè)新的 Access Token。
  • 特點(diǎn):生命周期長(zhǎng)(如 7 天或 30 天),與特定用戶(hù)綁定,服務(wù)器需要安全存儲(chǔ)其有效性記錄。
  • 存儲(chǔ):必須安全存儲(chǔ)。最佳實(shí)踐是存儲(chǔ)在 HttpOnly Cookie 中,這樣可以防止客戶(hù)端 JavaScript 腳本(如 XSS 攻擊)讀取它。

既然如此,為何不直接使用 Refresh Token 呢?

Access Token 通常是無(wú)狀態(tài)的,服務(wù)器無(wú)需記錄它,也導(dǎo)致 JWT 無(wú)法主動(dòng)吊銷(xiāo),而 Refresh Token 是有狀態(tài)的,服務(wù)器需要一個(gè)列表(數(shù)據(jù)庫(kù)中的“白名單”或“吊銷(xiāo)列表”)來(lái)記錄哪些 Refresh Token 是有效的,當(dāng)用戶(hù)更改密碼、或從某個(gè)設(shè)備上“主動(dòng)登出”時(shí),服務(wù)器端可以主動(dòng)將對(duì)應(yīng)的 Refresh Token 設(shè)為無(wú)效。

無(wú)感刷新的詳細(xì)工作流

下面是這個(gè)“魔法”發(fā)生的具體步驟:

(1) 首次登錄:用戶(hù)使用用戶(hù)名和密碼登錄。服務(wù)器驗(yàn)證成功后,返回一個(gè) Access Token 和一個(gè) Refresh Token。

(2) 正常請(qǐng)求:客戶(hù)端將 Access Token 存儲(chǔ)起來(lái),并在后續(xù)的每次 API 請(qǐng)求中,通過(guò) Authorization 請(qǐng)求頭將其發(fā)送給服務(wù)器。

(3) Token 過(guò)期:當(dāng) Access Token 過(guò)期后,客戶(hù)端再次用它請(qǐng)求 API。服務(wù)器會(huì)拒絕該請(qǐng)求,并返回一個(gè)特定的狀態(tài)碼,通常是 401 Unauthorized。

(4) 攔截 401 錯(cuò)誤:客戶(hù)端的請(qǐng)求層(如 Axios 攔截器)會(huì)捕獲這個(gè) 401 錯(cuò)誤。此時(shí),它不會(huì)立即通知用戶(hù)“你已掉線”,而是暫停這個(gè)失敗的請(qǐng)求。

(5) 發(fā)起刷新請(qǐng)求:攔截器使用 Refresh Token 去調(diào)用一個(gè)專(zhuān)門(mén)的刷新接口(例如 /api/auth/refresh)。

(6) 處理刷新結(jié)果:

  • 刷新成功:服務(wù)器驗(yàn)證 Refresh Token 有效,生成一個(gè)新的 Access Token(有時(shí)也會(huì)返回一個(gè)新的 Refresh Token,這被稱(chēng)為“刷新令牌旋轉(zhuǎn)”策略,可以提高安全性),并將其返回給客戶(hù)端。
  • 刷新失敗:如果 Refresh Token 也過(guò)期了或無(wú)效,服務(wù)器會(huì)返回錯(cuò)誤(如 403 Forbidden)。這意味著用戶(hù)的登錄會(huì)話徹底結(jié)束。

(7) 重試與終結(jié):

  • 若刷新成功:客戶(hù)端用新的 Access Token 自動(dòng)重發(fā)剛才失敗的那個(gè) API 請(qǐng)求。用戶(hù)完全感覺(jué)不到任何中斷,數(shù)據(jù)操作無(wú)縫銜接。
  • 若刷新失敗:客戶(hù)端清除所有認(rèn)證信息,強(qiáng)制用戶(hù)登出,并重定向到登錄頁(yè)面。

實(shí)戰(zhàn)演練:使用 Axios 攔截器實(shí)現(xiàn)無(wú)感刷新

Axios 的攔截器是實(shí)現(xiàn)這一流程的完美工具。下面是一個(gè)完整且考慮了并發(fā)問(wèn)題的實(shí)現(xiàn)方案。

(1) 創(chuàng)建 Axios 實(shí)例

首先,我們創(chuàng)建一個(gè)單獨(dú)的 Axios 實(shí)例,方便統(tǒng)一管理。

// a-pi/request.js
import axios from 'axios';

const service = axios.create({
 baseURL: '/api',
 timeout: 10000,
});

// 請(qǐng)求攔截器
service.interceptors.request.use(
 config => {
    // 在發(fā)送請(qǐng)求之前,從 state management (e.g., Vuex/Pinia/Redux) 獲取 token
    const accessToken = getAccessTokenFromStore(); 
    if (accessToken) {
      config.headers['Authorization'] = `Bearer ${accessToken}`;
    }
    return config;
  },
 error => {
    return Promise.reject(error);
  }
);

(2) 核心:響應(yīng)攔截器

這是實(shí)現(xiàn)無(wú)感刷新的關(guān)鍵。

// a-pi/request.js (續(xù))

// 用于刷新 token 的 API
import { refreshTokenApi } from './auth'; 

let isRefreshing = false; // 控制刷新?tīng)顟B(tài)的標(biāo)志
let requests = []; // 存儲(chǔ)因 token 過(guò)期而掛起的請(qǐng)求

service.interceptors.response.use(
 response => response, // 對(duì)成功響應(yīng)直接返回
 async error => {
    const { config, response: { status } } = error;
    
    // 1. 如果不是 401 錯(cuò)誤,直接返回錯(cuò)誤
    if (status !== 401) {
      return Promise.reject(error);
    }

    // 2. 避免重復(fù)刷新:如果正在刷新 token,將后續(xù)請(qǐng)求暫存
    if (isRefreshing) {
      return new Promise(resolve => {
        requests.push(() => resolve(service(config)));
      });
    }

    isRefreshing = true;

    try {
      // 3. 調(diào)用刷新 token 的 API
      const { newAccessToken } = await refreshTokenApi(); // 假設(shè) refresh token 通過(guò) HttpOnly cookie 自動(dòng)發(fā)送

      // 4. 更新本地存儲(chǔ)的 access token
      setAccessTokenInStore(newAccessToken);
      
      // 5. 重試剛才失敗的請(qǐng)求
      config.headers['Authorization'] = `Bearer ${newAccessToken}`;
      
      // 6. 重新執(zhí)行所有被掛起的請(qǐng)求
      requests.forEach(cb => cb());
      requests = []; // 清空隊(duì)列
      
      return service(config); // 返回重試請(qǐng)求的結(jié)果
    } catch (refreshError) {
      // 7. 如果刷新 token 也失敗了,則執(zhí)行登出操作
      console.error('Unable to refresh token.', refreshError);
      logoutUser(); // 清除 token,重定向到登錄頁(yè)
      return Promise.reject(refreshError);
    } finally {
      isRefreshing = false;
    }
  }
);

export default service;

代碼解析:

并發(fā)處理:isRefreshing 標(biāo)志和 requests 數(shù)組是關(guān)鍵。當(dāng)?shù)谝粋€(gè) 401 錯(cuò)誤觸發(fā)刷新時(shí),isRefreshing 變?yōu)?nbsp;true。后續(xù)在刷新完成前到達(dá)的 401 請(qǐng)求,都會(huì)被推進(jìn) requests 隊(duì)列中掛起,而不是重復(fù)發(fā)起刷新請(qǐng)求。當(dāng)刷新成功后,再遍歷隊(duì)列,依次執(zhí)行這些被掛起的請(qǐng)求。

原子操作:通過(guò)這種“加鎖”機(jī)制,確保了刷新 Token 的操作是原子的,避免了資源浪費(fèi)和潛在的競(jìng)態(tài)條件。

  • 優(yōu)雅降級(jí):當(dāng) Refresh Token 也失效時(shí),系統(tǒng)會(huì)執(zhí)行 logoutUser(),進(jìn)行清理工作并引導(dǎo)用戶(hù)重新登錄,這是一個(gè)優(yōu)雅的失敗處理方案。

無(wú)感刷新 Token 機(jī)制是現(xiàn)代 Web 應(yīng)用提升用戶(hù)體驗(yàn)的“標(biāo)配”。它將身份驗(yàn)證的復(fù)雜性隱藏在后臺(tái),為用戶(hù)提供了一個(gè)流暢、不間斷的操作環(huán)境。

實(shí)現(xiàn)這一機(jī)制,不僅僅是寫(xiě)幾行代碼,更是對(duì)認(rèn)證流程、安全性和用戶(hù)體驗(yàn)三者之間平衡的深刻理解。

責(zé)任編輯:趙寧寧 來(lái)源: JavaScript
相關(guān)推薦

2025-06-23 04:00:00

接口SpringToken

2009-03-06 10:01:00

802.11nWLAN

2019-10-25 20:00:06

華為

2025-02-10 09:20:00

LinuxScreen終端

2025-08-06 07:47:22

2022-09-28 12:39:46

axios攔截器

2024-07-11 10:38:02

2024-03-08 09:46:53

2019-04-25 10:40:02

分庫(kù)分表MySQL數(shù)據(jù)庫(kù)

2011-11-09 15:49:52

API

2009-12-03 11:12:42

路由器限速

2022-06-08 19:21:45

無(wú)密碼技術(shù)蘋(píng)果Passkey

2009-11-20 11:37:11

Oracle完全卸載

2019-04-12 11:34:09

華為

2013-07-15 10:45:42

2013-04-22 10:34:46

用戶(hù)體驗(yàn)設(shè)計(jì)UED認(rèn)知負(fù)荷

2022-09-09 08:41:43

Netty服務(wù)端驅(qū)動(dòng)

2010-03-30 10:44:05

Nginx啟動(dòng)

2021-05-24 10:55:05

Netty單機(jī)并發(fā)

2024-12-04 13:52:30

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

91在线中文字幕| xvideos亚洲| 欧美xxxxx在线视频| 成人在线免费视频| 国产精品中文字幕一区二区三区| 欧美国产亚洲精品久久久8v| 欧产日产国产精品98| 亚洲va中文在线播放免费| 中文字幕一区二区三区在线观看 | 中文字幕欧美区| 91嫩草视频在线观看| 久久久精品福利| 日韩精品电影| 精品视频在线观看日韩| www.51色.com| 成人免费福利| 午夜欧美2019年伦理| 亚洲日本无吗高清不卡| 日本国产在线观看| 激情久久五月天| 欧美在线视频一区| 欧美片一区二区| 日韩欧美视频专区| 亚洲精品在线视频| 中文字幕一区二区三区人妻在线视频| gogo亚洲高清大胆美女人体| 亚洲一区二区三区视频在线播放| 亚洲午夜激情| 国内在线精品| 99久久精品国产一区二区三区| 成人免费在线视频网站| 91视频在线视频| 日韩午夜激情| 久久免费国产视频| 欧美三级在线免费观看| 日本一二区不卡| 国产午夜精品免费一区二区三区| 看全色黄大色黄女片18| 欧美专区视频| 91精品国产91久久久久久最新毛片| 国产福利影院在线观看| 成人性生交大片免费观看网站| 一区二区三区四区蜜桃| 手机在线视频你懂的| 午夜视频在线观看免费视频| 久久综合九色综合97_久久久| 国产一区二区三区无遮挡| 亚洲av无码乱码国产麻豆| 国内国产精品久久| 成人淫片在线看| 一区二区的视频| 毛片基地黄久久久久久天堂| 国产精品久久一| 这里只有精品国产| 蜜臀精品一区二区三区在线观看| 国产精品777| 波多野结衣电车| 青椒成人免费视频| 国产日韩欧美在线看| 一二三四区在线| 六月婷婷色综合| 91精品在线观| 中文字幕乱码人妻无码久久| 免费在线观看日韩欧美| 国产精品影片在线观看| 一级黄色片在线观看| 韩国女主播成人在线观看| 亚洲一区免费网站| 成人爽a毛片一区二区| 成人中文字幕电影| 久久久久综合一区二区三区| 天天射天天色天天干| 99精品欧美一区二区蜜桃免费| 久久久久天天天天| www.在线视频.com| 亚洲黄色性网站| 欧美一级视频免费看| 成人av免费电影网站| 在线亚洲一区二区| 91看片破解版| 卡一精品卡二卡三网站乱码 | 亚洲自拍偷拍精品| 亚洲人成网77777色在线播放 | 麻豆精品视频在线| 91福利入口| 天天综合网在线观看| 久久精品欧美一区二区三区麻豆| 亚洲欧美日本国产有色| 亚洲区欧洲区| 色综合天天做天天爱| 艹b视频在线观看| 999久久久久久久久6666| 精品亚洲aⅴ在线观看| 国产精品麻豆免费版现看视频| 亚洲草久电影| 日本三级韩国三级久久| 国产原创中文av| 99久久免费国产| 致1999电视剧免费观看策驰影院| 大香伊人久久| 欧美日韩国产一区| 三叶草欧洲码在线| 99成人超碰| 18性欧美xxxⅹ性满足| 中文字幕在线观看高清| 91在线视频免费91| 影音先锋成人资源网站| 69成人免费视频| 久久激情综合网| 久久精品一区二区三区不卡免费视频| 日本欧美在线视频免费观看| 天天操天天色综合| 欧美性猛交xx| 日韩欧美国产精品综合嫩v| 午夜精品视频在线| 亚洲最大成人av| 久久综合99re88久久爱| 日本免费成人网| 欧美日韩卡一| 亚洲日本欧美日韩高观看| 国产一级aa大片毛片| 蜜桃一区二区三区在线观看| 精品久久久久久一区| 菠萝菠萝蜜在线视频免费观看| 欧美在线999| 一级做a爰片毛片| 欧美日韩一卡| 亚洲自拍中文字幕| 欧美日本一道| 欧美日韩你懂的| 精品成人av一区二区三区| 亚洲第一精品影视| 999国产在线| 超碰在线网址| 91精品国产色综合久久久蜜香臀| 国产日韩精品中文字无码| 久久激情网站| 免费av在线一区二区| 国产在线精彩视频| 亚洲激情成人网| 国产污片在线观看| av一区二区三区| 国产69精品久久久久久久| 给我免费播放日韩视频| 久久6免费高清热精品| 91国偷自产中文字幕久久| 中文字幕精品综合| 中文字幕网av| 91欧美国产| 91日韩在线播放| 成人黄色在线电影| 日韩视频不卡中文| 精品99在线观看| 国产91对白在线观看九色| 波多野结衣 作品| 2021年精品国产福利在线| 欧美黑人性视频| 欧美特黄一级视频| 欧美午夜www高清视频| av在线网站观看| 日韩av一区二| 一区二区日本伦理| 人人爱人人干婷婷丁香亚洲| 欧美日韩国产成人| 色窝窝无码一区二区三区| 精品久久久一区| 波多野在线播放| 精品一区二区精品| 人人妻人人澡人人爽欧美一区双| 另类ts人妖一区二区三区| 欧洲精品久久久| 自拍视频在线免费观看| 欧美一区二区三区免费视频| 麻豆视频在线观看| 久久先锋影音av| 国内外成人免费在线视频| 亚洲一区二区| 国产一区二区免费电影| 成人在线爆射| 久久99精品国产99久久6尤物| 欧美 日韩 国产 精品| 欧美性videos高清精品| 国产在视频线精品视频| 国产99精品视频| 老熟妇仑乱视频一区二区| 91视频久久| 国产欧美日韩亚洲| 国产精品高潮久久| 高清欧美性猛交xxxx黑人猛交| 国内精品在线视频| 日韩欧美一卡二卡| 无码人妻熟妇av又粗又大| 亚洲色图视频免费播放| 一本加勒比北条麻妃| 国内精品伊人久久久久av一坑 | 日本蜜桃在线观看视频| 中文字幕亚洲一区二区三区五十路| 午夜精品久久久久久久96蜜桃 | 欧美另类69xxxxx| 7777精品久久久大香线蕉小说| 中文字幕资源网在线观看免费 | 99久久99久久综合| 99精品视频国产| 天堂成人国产精品一区| 国产四区在线观看| 精品国产精品久久一区免费式| 2014国产精品| 99久久亚洲国产日韩美女| 国模精品系列视频| 久草免费在线| 亚洲天堂日韩电影| 欧美一级特黄aaaaaa大片在线观看| 欧美在线免费观看视频| 日韩乱码人妻无码中文字幕| 综合激情成人伊人| 91网站免费入口| 99热这里都是精品| 精产国品一二三区| 久久99精品国产.久久久久| 欧美日韩亚洲一二三| 亚洲国产精品第一区二区| 神马午夜伦理影院| 久久视频精品| 视频一区二区综合| 九九热爱视频精品视频| 精品国产一区二区三区四区精华| 中文字幕一区二区三区中文字幕| 国产欧美一区二区三区在线看| 欧美黄色网页| 欧洲亚洲免费视频| 一本大道色婷婷在线| 91高清视频在线免费观看| 手机av免费在线| 久久艹在线视频| 黄色网页网址在线免费| 日韩中文av在线| 尤物网址在线观看| 色哟哟入口国产精品| 国模吧精品人体gogo| 亚洲摸下面视频| 青青国产在线| 亚洲免费成人av电影| 日韩电影网址| 亚洲一级一级97网| 第九色区av在线| 在线观看欧美日韩| av在线日韩国产精品| 色一区av在线| 18视频在线观看| 久久99视频精品| √天堂8资源中文在线| 久久免费在线观看| 乡村艳史在线观看| 国产精品久久久av久久久| 激情久久一区二区| 亚洲999一在线观看www| 亚洲啊v在线免费视频| 国产精品国产精品| 色婷婷综合久久久久久| 欧洲精品久久| 欧美hd在线| 神马午夜伦理影院| 亚洲久久一区二区| caopor在线视频| 国内精品免费在线观看| 中文字幕一区二区三区人妻在线视频 | 精品日韩视频在线观看| 亚洲精品国产无码| 欧美久久久久久蜜桃| www.色呦呦| 精品调教chinesegay| 92国产在线视频| 欧美成人在线免费视频| 碰碰在线视频| 国产精品中文字幕在线| 久久久久毛片免费观看| 国产一区二区三区黄| 黑丝美女一区二区| 无码人妻aⅴ一区二区三区日本| 亚洲二区在线| 噼里啪啦国语在线观看免费版高清版| 精品一二三四在线| 黄色性生活一级片| 中文av字幕一区| 精品在线视频免费观看| 一本大道久久a久久综合婷婷| 中文字幕日韩经典| 亚洲第一福利网| 日本在线观看www| 2018日韩中文字幕| 国产va免费精品观看精品| 精品国产综合区久久久久久| 色97色成人| 欧美在线观看www| 久久99精品久久久| 9.1成人看片免费版| 亚洲视频网在线直播| 日韩不卡在线播放| 欧美一级精品在线| 久久精品蜜桃| 久久免费成人精品视频| 只有精品亚洲| 欧美一区二区影视| 国内精品久久久久久久影视麻豆| 男人的天堂日韩| www.亚洲色图.com| 国产黄色的视频| 欧美视频在线一区二区三区 | 久久久日本电影| 天天综合在线观看| 欧美重口乱码一区二区| 黄色工厂这里只有精品| 国产永久免费网站| 国产欧美综合在线观看第十页| 久久精品视频久久| 日韩一区国产二区欧美三区| gogogo高清在线观看免费完整版| 97色在线视频观看| 一区二区三区四区高清视频| 在线成人性视频| 日韩在线一二三区| 少妇毛片一区二区三区| 五月激情综合色| 高清毛片aaaaaaaaa片| 久久久成人精品视频| 国产一区二区三区四区五区3d| 欧美系列一区| 久久综合狠狠| 波多野吉衣中文字幕| 激情久久av一区av二区av三区| 精品人妻无码一区二区| 久久成人国产精品| 另类一区二区三区| 神马影院我不卡午夜| 日韩高清一级片| 波多野在线播放| 欧美亚洲国产一卡| 福利视频在线导航| 国产精品美女久久久久久免费 | 日产精品久久久久久久蜜臀| 久久精品国产在热久久| 一级片久久久久| 欧美亚洲国产一卡| 18视频免费网址在线观看| 国产精品日韩欧美| 日韩免费高清| 国产一级片自拍| 亚洲丝袜另类动漫二区| av高清一区二区| 欧美国产日韩二区| 六月丁香久久丫| 欧美少妇性生活视频| 日本一区二区成人| 国产精品久久久久久久久久久久久久久久久久| 在线一区二区日韩| 欧美91在线|欧美| a级网站在线观看| 国产不卡在线一区| 永久免费看片在线播放| 日韩av在线网站| 欧美freesex| 中文字幕中文字幕99| 国产91丝袜在线播放九色| 你懂的国产视频| 亚洲欧洲偷拍精品| 99tv成人影院| 97视频久久久| 中文字幕久久午夜不卡| 精品久久国产视频| 欧洲成人免费视频| 欧美激情黄色片| 图片区偷拍区小说区| 欧美性极品少妇精品网站| 99精品老司机免费视频| 亚洲综合色av| 亚洲欧美日韩国产一区二区| 一级特黄曰皮片视频| 日韩美一区二区三区| 依依综合在线| 懂色av一区二区三区四区五区| 粉嫩一区二区三区在线看| 天堂网中文字幕| 久久九九免费视频| 婷婷五月色综合香五月| 五月激情婷婷在线| 天天色综合天天| 黄色免费在线观看| 精品久久蜜桃| 国产一区二区在线影院| 久久久午夜影院| 久久人人爽人人爽爽久久| 色老板在线视频一区二区| 国产精品v日韩精品v在线观看| 亚洲成a人片综合在线| 电影av在线| 国产一区二区三区黄| 国产一区二区三区精品视频| 丰满人妻老熟妇伦人精品| 欧美激情国内偷拍| 色狮一区二区三区四区视频|