用 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 攔截器不失為一個好選擇。



參考資源:


3會員
5內容數
我是Sail,這裡主要分享一些自己覺得有趣的前端議題。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
創作者要怎麼好好休息 + 避免工作過量?《黑貓創作報#4》午安,最近累不累? 這篇不是虛假的關心。而是《黑貓創作報》發行以來可能最重要的一篇。 是的,我們這篇講怎麼補充能量,也就是怎麼休息。
Thumbnail
avatar
黑貓老師
2024-06-29
防曬產品係數測試報告彙整(2024年)從2014年起,自己對於市售防曬產品的效能產生了濃厚的興趣。因為當時候發現不少產品的防曬係數其實標示是有問題的,像是原本應該是人體測試的SPF與PA數值,實際上沒有做,只用機器測試的數據來充當,但這兩者卻有很大的差異。像是防曬係數其實有強度、廣度與平均度三個面向需要一起判斷,但多數廠商並沒有完整標示
Thumbnail
avatar
邱品齊皮膚科醫師
2023-04-27
用英文叫別人「別那麼急/別那麼激動」遛狗結果狗狗在路上暴走、孩子看到遊樂園等不及要衝了、朋友說話太嗨讓你快要跟不上。用三句英文讓對方或你的毛小孩「消消火」。
Thumbnail
avatar
你的英日語自學導師 譯難忘  ོꦿ༄꧁꧂
2023-12-12
用一個英文單字講人有多麼「跩」「唉呦很跩喔」、「很『秋』哦」,中文的跩和台語的秋,可以形容人很得意有自信又有點霸氣。就這麼剛好英文的own這個字可以傳達出這種fu。想知道怎麼使用嗎?這篇用超白話讓你秒懂。
Thumbnail
avatar
你的英日語自學導師 譯難忘  ོꦿ༄꧁꧂
2023-10-24
用 SEO 思維規劃以終為始的行銷策略:以 ChoozSEO 為例聊聊如何用 AI主題關鍵字工具來優化內容策略,並從中獲得更多洞見。
Thumbnail
avatar
Sho 的路上觀察手記
2023-10-18
用最簡單的日文問:「可以跟你合照嗎?」邀請日本人一起合照,卻不知道怎麼開口說出來嗎?看完這篇,馬上能現學現賣。
Thumbnail
avatar
你的英日語自學導師 譯難忘  ོꦿ༄꧁꧂
2023-10-05
用邏輯改變世界專訪(下)弱連結,真「有」用?你會察言觀色嗎?突破認知!|怪獸科技公司怪獸科技公司第二季,一起培養在快速變化社會的超強適應力!專案管理(PM)不僅涉及技術和流程的掌握,更重要的是人際溝通能力。過去曾擔任 PM 的 Davina 將帶我們深入解析 AI 時代下,她自己是養成溝通能力的一些好用方法,以及持續創新、突破認知邊界的意義。
Thumbnail
avatar
王政皓|怪獸科技公司
2023-08-30
用SPSS進行HLM第五章:步驟策略和解釋變異量測量本文章將介紹實務中進行HLM會需要注意的事項,包含樣本量要求、基本假設、計算解釋變異量和HLM建構策略。
Thumbnail
avatar
Dr. Rover
2023-08-15
用SPSS進行HLM第四章:三層次之隨機截距斜率模型接續第三章內容,有時候多層次資料不只一個層次,可能具有多種層次,例如:學生屬於某個學校,而學校又屬於某個縣市。本章主要說明三層次之隨機截距模型的公式和SPSS操作,我們先從公式開始,然後在教學SPSS視窗和語法操作,相信看完後,讀者就會了解三層次之隨機截距斜率模型概念和操作。
Thumbnail
avatar
Dr. Rover
2023-07-26
用SPSS進行HLM第三章:雙層次之隨機截距斜率模型接續第二章內容,本章主要說明雙層次之隨機截距模型的公式和SPSS操作,我們先從公式開始,然後在教學SPSS視窗和語法操作,相信看完後,讀者就會了解雙層次之隨機截距斜率模型概念和操作。
Thumbnail
avatar
Dr. Rover
2023-07-13
用SPSS進行HLM第二章:雙層次之隨機截距模型本章主要說明雙層次之隨機截距模型的公式和SPSS操作,我們先從最簡單的一個Level 1固定自變項模型開始,到複雜的兩個Level 1和1個Level 2固定自變項模型,相信看完後,讀者就會了解雙層次之隨機截距模型概念和操作。
Thumbnail
avatar
Dr. Rover
2023-06-30
用SPSS進行HLM第一章:多層次資料問題和HLM使用時間階層線性模式(MLM) 或是多層次模式(HLM)可以說是當代社會科學研究重要的統計方法學。現實中,我們收集到的資料可能巢套在不同層層次的單位當中。這種巢套關係很容易違反資料獨立性的假設導致許多傳統統計方法無法使用,本文將從簡單的公式說明多層次資料的問題,並介紹HLM的概念。
Thumbnail
avatar
Dr. Rover
2023-06-15