用 axios interceptor 實作 refresh token

更新於 發佈於 閱讀時間約 5 分鐘

動機

最近筆者在專案中串接 Spotify 提供的 Web API,利用官方推薦的 PKCE flow 來做使用者驗證。在該驗證流程中,每次向 Spotify 請求 token 時,都會拿到一組 access token 和 refresh token,然後在 access token 過期時,程式就需要透過 refresh token 向 Spotify 的 API 再請求新的一組 token。


思路

在 概念驗證 (proof of concept,POC) 階段,筆者僅串接 Get New Releases API,因此首頁載入後會經過以下流程:

  • 重新導向 Spotify 頁面,使用筆者的 client id 授權,拿到 access token
  • 利用上一步驟拿到的 access token 去呼叫 Get New Releases API

從上面的流程不難想像,如果沒有對 request 或 response 做任何管控,可能會有以下問題:

  • 每次頁面 reload 時,都會再要一次 access token,造成過多不必要的請求。
  • access token 過期時,打 Get New Releases API 會收到 401 Unauthorized 回應,導致程式中斷,UI上的資料會被清空。

因此筆者需要一種機制檢查 access token 是否過期,以及 Get New Release 在 token 過期後,需要刷新 token 並重新請求 New Release 資源。

雖然可以直接對 fetch API 的邏輯進行擴充,但看到 axios 有攔截器 (interceptor) 機制,可以對 request 和 response 過程做更精準的操控後,筆者決定使用 axios 來實作。


Axios 是什麼 ?

axios 是基於 XMLHttpRequest 和 Promise 的 http request 套件

axios 是基於 XMLHttpRequest 和 Promise 的 http request 套件


Axios 是一個基於 XMLHttpRequest 和 Promise,用來處理 http 請求的套件,相較於 fetch API,它具有以下亮點,因此廣受網頁開發者的喜愛:

  • 可以在瀏覽器 和 Node.js 裡運作。
    Node.js 直到最近的 v22.0 版才支援 fetch API,在此之前,若要發送請求,多半會使用它的 http 模組或 node-fetch 套件,而 axios 在 Node 使用時,底層便是使用 Node 的 http 模組。
  • 彈性大的 API。
    在 request 的 options 裡可以做多種配置,例如可用 transformRequesttransformResponse 將送出或取回的資料轉型,還可設定 api endpoint 的 baseURL。
  • Axios instance 讓 request 的配置可以被複用。
const instance = axios.create({
baseURL: "https://some-domain.com/api/",
timeout: 1000,
headers: { "X-Custom-Header": "foobar" },
});

instance 這個物件就可以替代原本用來發 request 的 axios 物件,並帶有以上這些預設的 config。

Axios Interceptor 是什麼?

axios instance 可以加入 interceptor,對 request 和 response 添加額外的行為。

axios instance 可以加入 interceptor,對 request 和 response 添加額外的行為。

axios.instance 提供 interceptor.use() 方法,可以在 request 發出之前、response 的 Promise resolve 之前做一些額外的操作,筆者便利用它來做 token 時效的檢查以及 token 失效後刷新 token 的功能。

實作

建立 axios instance

const instance = axios.create({
baseURL: BASE_ENDPOINT,
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
});


添加 request interceptor,在每次請求 token 時,用 localStorage 裡面存的 timestamp 檢查 access token 是否過期,若否則不請求 token,若是則用 localStorage 裡的 refresh token 重新請求 access token。

request interceptor 檢查 access token 的有效期限

request interceptor 檢查 access token 的有效期限

添加 response interceptor,在每次請求 New Releases 得到 response 後,檢查是否有 401 錯誤,若是則重新請求 access token,並重新請求 New Releases

response interceptor 檢查 response 的 status code,判斷是否重新發送請求

response interceptor 檢查 response 的 status code,判斷是否重新發送請求


總結

後來筆者在網路上發現,其實用一個 wrapper function 把 fetch API 包裝起來,也可以做到攔截 request/response 的效果,但我認為 axios 攔截器的好處在於,它將請求前後的邏輯和請求本身整合在一起,讓請求的邏輯變得更完整且可復用,若不介意需要額外安裝套件的話,axios 攔截器不失為一個好選擇。



參考資源:


留言
avatar-img
留言分享你的想法!
我是頭香!
avatar-img
廖偉帆的沙龍
3會員
5內容數
我是Sail,這裡主要分享一些自己覺得有趣的前端議題。
廖偉帆的沙龍的其他內容
2024/05/30
在進行Electron 專案時,後端夥伴選擇將 sqlite 資料庫跟專案檔打包成一個執行檔。在開發過程中,前端的操作經常會更動到 db的資料,此時 Git 就會追蹤到 db 的變化,因此前端在推送檔案到遠端 repo 前,會需要將其移出 Git 追蹤範圍,該怎麼做?
Thumbnail
2024/05/30
在進行Electron 專案時,後端夥伴選擇將 sqlite 資料庫跟專案檔打包成一個執行檔。在開發過程中,前端的操作經常會更動到 db的資料,此時 Git 就會追蹤到 db 的變化,因此前端在推送檔案到遠端 repo 前,會需要將其移出 Git 追蹤範圍,該怎麼做?
Thumbnail
2024/05/01
在 Vue 專案中使用 Apollo Graphql Client 從 API 獲取資料,由於資料結構較為複雜,筆者便跟著網路教學使用 codegen 工具自動化產生 TypeScript 型別定義。在某個元件中,需要使用 defineProps 來撰寫型別定義,結果⋯⋯
Thumbnail
2024/05/01
在 Vue 專案中使用 Apollo Graphql Client 從 API 獲取資料,由於資料結構較為複雜,筆者便跟著網路教學使用 codegen 工具自動化產生 TypeScript 型別定義。在某個元件中,需要使用 defineProps 來撰寫型別定義,結果⋯⋯
Thumbnail
2024/04/28
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
Thumbnail
2024/04/28
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
在串接第三方 API時,需要定期刷新 token,那有沒有辦法針對 request 和 response 做配置,在 token 過期時先做刷新、再做請求呢?本文要介紹利用 axios 套件提供的攔截器刷新 token 的作法。
Thumbnail
在串接第三方 API時,需要定期刷新 token,那有沒有辦法針對 request 和 response 做配置,在 token 過期時先做刷新、再做請求呢?本文要介紹利用 axios 套件提供的攔截器刷新 token 的作法。
Thumbnail
R036 Blog API 伺服器的維護更新日誌 (2024/04/30) 開發環境技術 語言: Javascript 環境: Node JS 框架: Express.js 本次維護目的 優化及測試API伺服器程運行 重溫程式碼架構以便日後更新優化 Reac
Thumbnail
R036 Blog API 伺服器的維護更新日誌 (2024/04/30) 開發環境技術 語言: Javascript 環境: Node JS 框架: Express.js 本次維護目的 優化及測試API伺服器程運行 重溫程式碼架構以便日後更新優化 Reac
Thumbnail
本次教學主要內容是如何使用Spotify Api獲取自己帳號的音樂清單資料,以Postman來進行測試,了解Spotify Api的Token使用流程。 Spotify Api 開發者手冊 https://developer.spotify.com/documentation
Thumbnail
本次教學主要內容是如何使用Spotify Api獲取自己帳號的音樂清單資料,以Postman來進行測試,了解Spotify Api的Token使用流程。 Spotify Api 開發者手冊 https://developer.spotify.com/documentation
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News