Vue Academy · レッスン

Axiosインターセプターによる認証API呼び出し

Authorizationヘッダー用のリクエストインターセプター、401 → refresh → retryのレスポンスインターセプター

レッスン 3/413 ステップ

「Axiosインターセプターによる認証API呼び出し」はCoddyKit上の無料Vue Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはVue Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Vue Academyコースには全4レッスンが含まれています。

インターセプターパターン

すべての呼び出しで認証ヘッダーの付加や401の処理を行う代わりに、Axiosのinterceptorsでこのロジックを一元化できます。リクエストインターセプターがトークンを追加し、レスポンスインターセプターが有効期限切れとリフレッシュを透過的に処理します。

Axiosインスタンスを作成する

APIのベースURLとwithCredentialsを設定した専用インスタンスを作成します。これにより、httpOnlyのリフレッシュCookieがリフレッシュエンドポイントに送信されます。

import axios from 'axios'

const api = axios.create({
  baseURL: '/api',
  withCredentials: true // send cookies
})

export default api

アクセストークンをメモリに保存する

アクセストークンはlocalStorageではなく、モジュール変数(またはPiniaストア)に保持します。小さなアクセサーのペアを用意すると、インターセプターからトークンを読み取り、更新できます。

let accessToken = null

export function setAccessToken(t) { accessToken = t }
export function getAccessToken() { return accessToken }

リクエストインターセプター: ヘッダーを追加する

リクエストインターセプターはすべてのリクエストの前に実行され、トークンが存在する場合はAuthorization: Bearer <token>を付加します。

api.interceptors.request.use((config) => {
  const token = getAccessToken()
  if (token) {
    config.headers.Authorization = 'Bearer ' + token
  }
  return config
})

レスポンスインターセプター: 401を捕捉する

レスポンスインターセプターは成功したレスポンスを変更せずに通過させますが、401が発生した場合はリフレッシュフローを開始します。

api.interceptors.response.use(
  (response) => response,
  async (error) => {
    const original = error.config
    if (error.response?.status === 401 && !original._retried) {
      // ... refresh and retry (next scenes)
    }
    return Promise.reject(error)
  }
)

無限リトライループを防ぐ

失敗したリクエストに_retriedのようなフラグを付け、リトライを1回だけに制限します。リフレッシュ自体が401を返した場合は、無限ループに入らずリクエストを拒否します。

if (error.response?.status === 401 && !original._retried) {
  original._retried = true
  // attempt refresh exactly once for this request
}

リフレッシュエンドポイントを呼び出す

401が発生したら、/auth/refreshにPOSTします。ブラウザーはhttpOnlyのリフレッシュCookieを自動的に送信し、サーバーは新しいアクセストークンを返します。

const { data } = await api.post('/auth/refresh')
setAccessToken(data.accessToken)

元のリクエストをリトライする

リフレッシュ後、元の設定のヘッダーを更新してリクエストを再実行します。ユーザーがこの中断を意識することはありません。

original.headers.Authorization = 'Bearer ' + data.accessToken
return api(original) // retry the original request

同時に発生した401を処理する

多数のリクエストが同時に失敗した場合、リフレッシュ呼び出しをN個並行して実行するのは避けたいものです。実行中のリフレッシュPromiseを1つ共有し、待機中のリクエストはそれを待ってから新しいトークンでリトライします。

let refreshing = null

function refreshOnce() {
  if (!refreshing) {
    refreshing = api.post('/auth/refresh')
      .finally(() => { refreshing = null })
  }
  return refreshing
}

あきらめてログアウトさせる

リフレッシュに失敗した場合(リフレッシュトークンの期限切れまたは無効)、メモリ上のトークンを削除してログイン画面にリダイレクトします。これがアプリ全体のセッション有効期限切れを処理する唯一の場所になります。

try {
  await refreshOnce()
} catch {
  setAccessToken(null)
  router.push('/login')
  return Promise.reject(error)
}

コンポーネントでインスタンスを使用する

コンポーネントでは、設定済みのapiインスタンスをインポートして呼び出すだけです。認証ヘッダー、リフレッシュ、リトライはコンポーネントのコードから完全に透過的に処理されます。

<script setup>
import api from '@/lib/api'
import { ref, onMounted } from 'vue'

const profile = ref(null)
onMounted(async () => {
  const { data } = await api.get('/me')
  profile.value = data
})
</script>

確認テスト

Axiosインターセプターについての理解度を確認しましょう。

まとめ

インターセプターを使った認証付き呼び出しについて学びました。

  • リクエストインターセプターがメモリ上のトークンからAuthorization: Bearerを追加します
  • レスポンスインターセプターが401を捕捉してリフレッシュします
  • _retriedフラグにより、元のリクエストを正確に1回だけリトライします
  • POST /auth/refreshがhttpOnly Cookieを使って新しいトークンを取得します
  • 同時に発生した401では1つのリフレッシュPromiseを共有し、失敗時は強制的にログアウトさせます
無料で開始

AI チューターと学ぶ HTML — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
42
レッスン
156

よくある質問

「Axiosインターセプターによる認証API呼び出し」レッスンは無料ですか?

はい。「Axiosインターセプターによる認証API呼び出し」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Vue Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Vue Academyコースには全4レッスンが含まれています。

「Axiosインターセプターによる認証API呼び出し」で何を学びますか?

Authorizationヘッダー用のリクエストインターセプター、401 → refresh → retryのレスポンスインターセプター ブラウザで直接実行するハンズオンコードでVue Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Vue Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのVue Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Axiosインターセプターによる認証API呼び出し」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このVue Academyレッスンでコードを書いて実行できますか?

はい。すべてのVue Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Vue SPA向けFastifyバックエンド
  2. JWT認証:ログインとリフレッシュ
  3. Axiosインターセプターによる認証API呼び出し
  4. フルスタックVueの本番デプロイ
← Vue Academyに戻る