用 axios interceptor 實作 refresh token

更新於 2024/05/13閱讀時間約 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
3會員
5內容數
我是Sail,這裡主要分享一些自己覺得有趣的前端議題。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
廖偉帆的沙龍 的其他內容
在 Vue 專案中使用 Apollo Graphql Client 從 API 獲取資料,由於資料結構較為複雜,筆者便跟著網路教學使用 codegen 工具自動化產生 TypeScript 型別定義。在某個元件中,需要使用 defineProps 來撰寫型別定義,結果⋯⋯
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
data-* attributes 是 HTML 內建的屬性,可將網頁的狀態與元素進行綁定。而Tailwind CSS 在 3.2 版更新中推出使用 data-* attributes 自訂樣式的功能,讓樣式設定可以更動態多變。
在 Vue 專案中使用 Apollo Graphql Client 從 API 獲取資料,由於資料結構較為複雜,筆者便跟著網路教學使用 codegen 工具自動化產生 TypeScript 型別定義。在某個元件中,需要使用 defineProps 來撰寫型別定義,結果⋯⋯
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
data-* attributes 是 HTML 內建的屬性,可將網頁的狀態與元素進行綁定。而Tailwind CSS 在 3.2 版更新中推出使用 data-* attributes 自訂樣式的功能,讓樣式設定可以更動態多變。
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
xhr 在下面的例子裡,我們首先建立了一個 XMLHttpRequest 物件,並使用 .open() 開啟一個 URL,最後使用 .send() 發出 request。 具體來說步驟有四個: 建立XMLHttpReque 開啟一個請求。 送出請求。 拿到回應後去處理畫面要如何呈現。
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
👨‍💻簡介 最近因為憑證越來越多,需要監控什麼時候到期,當到期時發送到期通知,因此撰寫一個簡單的小程式來完成。 這次使用Python和Telegram Bot來監控SSL證書的到期時間並發送通知。並使用GCP工具,如CloudFunction和CloudScheduler做部署平台。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
授權碼模式連線流程 用戶端請求自己的伺服器。 伺服器發現用戶沒登入,就導向認證伺服器。 認證伺服器顯示授權頁面,等待用戶授權。 用戶確認授權後,授權頁面會向認證伺服器請求授權碼。 用戶獲取授權碼。 用戶將授權碼傳給伺服器。 伺服器拿授權碼向認證伺服器取得token。 應用註冊
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
xhr 在下面的例子裡,我們首先建立了一個 XMLHttpRequest 物件,並使用 .open() 開啟一個 URL,最後使用 .send() 發出 request。 具體來說步驟有四個: 建立XMLHttpReque 開啟一個請求。 送出請求。 拿到回應後去處理畫面要如何呈現。
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
👨‍💻簡介 最近因為憑證越來越多,需要監控什麼時候到期,當到期時發送到期通知,因此撰寫一個簡單的小程式來完成。 這次使用Python和Telegram Bot來監控SSL證書的到期時間並發送通知。並使用GCP工具,如CloudFunction和CloudScheduler做部署平台。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
授權碼模式連線流程 用戶端請求自己的伺服器。 伺服器發現用戶沒登入,就導向認證伺服器。 認證伺服器顯示授權頁面,等待用戶授權。 用戶確認授權後,授權頁面會向認證伺服器請求授權碼。 用戶獲取授權碼。 用戶將授權碼傳給伺服器。 伺服器拿授權碼向認證伺服器取得token。 應用註冊