0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS Amplifyでセッション情報を扱う「fetchAuthSession」

Posted at

1.fetchAuthSessionとは?

fetchAuthSession()は、AWS Amplifyのauthモジュールに含まれている関数で、現在ログイン中のユーザーのセッション情報を取得するために使います。

AmplifyはAWS Cognitoをベースにした認証機能を提供していますが、ユーザーがログインしているかどうか、あるいはどのようなトークンが発行されているかをフロントエンドで確認したい場面が多くあります。そのときに使うのがこのfetchAuthSession()です。

取得できる主な情報

fetchAuthSession()を使うと、以下のような情報を取得できます。

項目名 説明
accessToken APIのAuthorizationヘッダーに使うアクセストークン
idToken ユーザーの属性情報などを含むIDトークン
refreshToken アクセス・IDトークンを更新するためのトークン
identityId Cognito Identity PoolのID(未認証ユーザー含む)
credentials AWSリソースにアクセスするための一時的な認証情報

fetchAuthSessionが使われる主な場面

使われるシーン 内容
API呼び出し前の認証 アクセストークンをヘッダーに設定してAPIを呼び出す
アプリ起動時のログイン状態判定 ログイン済みかどうかをセッションから判断
AWSリソース操作(S3など) 一時クレデンシャルを使ってS3にアップロードなどを行う
認証エラー対応 トークンの期限切れや未ログイン状態の判定に使う

2. 基本的な使い方

fetchAuthSession()はPromiseベースの非同期関数で、awaitを使って呼び出します。認証状態に応じて、取得できる内容が変わります。

最小限の使い方

import { fetchAuthSession } from "aws-amplify/auth";

async function checkSession() {
  const session = await fetchAuthSession();
  console.log(session);
}

このコードでは、fetchAuthSession()を呼び出して現在のセッション情報を取得し、内容をコンソールに出力しています。

sessionオブジェクトの中身

取得されるsessionオブジェクトには、以下のような情報が含まれます(ログイン済みの例)

{
  tokens: {
    accessToken: AccessToken,
    idToken: IdToken,
    refreshToken: RefreshToken
  },
  credentials: {
    accessKeyId: string,
    secretAccessKey: string,
    sessionToken: string,
    expiration: Date
  },
  identityId: string,
  userSub: string
}

トークンの取り出し方

トークンはそのまま文字列ではなく、ラッパーオブジェクトとして返ってくるため、toString()を使って文字列化します。

const accessToken = session.tokens?.accessToken.toString();
const idToken = session.tokens?.idToken.toString();
const refreshToken = session.tokens?.refreshToken.toString();

ログインしていない場合の挙動

ログインしていない状態でfetchAuthSession()を呼び出すと、session.tokensなどがundefinedになることがあります。そのため、安全にアクセスするためにはオプショナルチェーン(?.)やtry-catchによるエラーハンドリングが推奨されます。

try {
  const session = await fetchAuthSession();

  if (session.tokens) {
    const accessToken = session.tokens.accessToken.toString();
    console.log("Access Token:", accessToken);
  } else {
    console.log("未ログインです");
  }
} catch (error) {
  console.error("セッション取得エラー", error);
}

このように、基本的な呼び出しはシンプルですが、nullチェックや型への注意が不可欠です。

3. アクセストークンなどの取得例

fetchAuthSession()から取得したトークンは、APIのAuthorizationヘッダーに付与したり、ユーザー認証状態のチェックに使ったりします。

アクセストークンの取得

import { fetchAuthSession } from "aws-amplify/auth";

async function getAccessToken(): Promise<string | null> {
  try {
    const session = await fetchAuthSession();
    const accessToken = session.tokens?.accessToken?.toString();
    return accessToken ?? null;
  } catch (error) {
    console.error("アクセストークン取得エラー:", error);
    return null;
  }
}
  • session.tokens?.accessToken?.toString()で安全に文字列を取り出しています。
  • 未ログイン状態ではtokensundefinedになる可能性があるため、オプショナルチェーン(?.)を使います。
  • トークンが取得できないときはnullを返すようにしておくと、API通信時に条件分岐しやすくなります。

IDトークン・リフレッシュトークンの取得

const session = await fetchAuthSession();

const idToken = session.tokens?.idToken?.toString();
const refreshToken = session.tokens?.refreshToken?.toString();

console.log("ID Token:", idToken);
console.log("Refresh Token:", refreshToken);

IDトークンとアクセストークンの違い

トークン名 用途 含まれる情報
Access Token APIリクエストの認可 スコープ、発行者、ユーザーのIDなど
ID Token 認証済みユーザー情報の取得 名前、メールアドレス、ユーザー属性など
Refresh Token トークンの再取得 有効期限を超えてアクセストークンを再取得する

すべてのトークンを一括取得する関数例

type AuthTokens = {
  accessToken: string;
  idToken: string;
  refreshToken: string;
};

async function getTokens(): Promise<AuthTokens | null> {
  try {
    const session = await fetchAuthSession();

    if (!session.tokens) return null;

    return {
      accessToken: session.tokens.accessToken.toString(),
      idToken: session.tokens.idToken.toString(),
      refreshToken: session.tokens.refreshToken.toString(),
    };
  } catch (error) {
    console.error("トークン取得に失敗:", error);
    return null;
  }
}

注意点まとめ

ポイント 内容
トークンは必ず文字列化する .toString()を忘れるとAPIでエラーになる
未ログインチェックを必ず入れる tokensundefinedのケースに備える
トークンの保存は注意 セキュリティ上、トークンはlocalStorageなどに保存しない方が安全です。必要であればメモリ上(Contextなど)で保持します

4. よくあるエラーと対処法

fetchAuthSession()はシンプルな関数に見えますが、Amplifyのバージョン・ログイン状態・アプリの構成によってさまざまなエラーが発生する可能性があります。

1:tokens is undefined

■ 現象:

TypeError: Cannot read properties of undefined (reading 'accessToken')

■ 原因:

  • ユーザーが未ログイン状態であるため、session.tokensundefinedになっている。
  • fetchAuthSession()はセッションが存在しない場合でも例外を出さず、単にtokensがnullになる。

対処法:

  • 必ずtokensの存在チェックを行ってからアクセスするようにします。
const session = await fetchAuthSession();

if (!session.tokens) {
  console.warn("未ログインです");
  return;
}

const token = session.tokens.accessToken.toString();

2:fetchAuthSession is not a function

■ 現象:

TypeError: fetchAuthSession is not a function

■ 原因:

  • Amplifyのバージョン5以上では、fetchAuthSessionaws-amplifyではなく**aws-amplify/auth**からインポートする必要があります。
  • 誤ったimportが原因で関数自体が存在しない。

対処法:

// 間違った書き方
import { fetchAuthSession } from "aws-amplify";

// 正しい書き方(Amplify v5以降)
import { fetchAuthSession } from "aws-amplify/auth";

v4以前を使っている場合はAuth.currentSession()が相当する機能です。

エラー3:トークン取得後にAPIが401 Unauthorized

■ 現象:

  • トークンをヘッダーに付けてAPIを呼び出しても、サーバー側で401(未認証)エラーになる。

■ 原因:

  • アクセストークンのフォーマットが不正(例:toString()し忘れ)
  • トークンが期限切れ
  • サーバー側の認証設定ミス(例:CognitoのIssuerチェックミス)

対処法:

  • トークンは必ず .toString() してから渡す
  • トークンの有効期限をチェックし、必要であればログインを促す
  • サーバーのJWT検証ロジックを見直す(Issuer、Audienceなど)
const token = session.tokens?.accessToken?.toString();

fetch("/api/secure-endpoint", {
  headers: {
    Authorization: `Bearer ${token}`,
  },
});

エラー4:Amplify未初期化

■ 現象:

Amplify has not been configured correctly

■ 原因:

  • Amplify.configure()が呼ばれていない、もしくは設定が不完全。

対処法:

  • アプリの最初(index.tsxmain.tsx)で確実にAmplifyを初期化してください。
import { Amplify } from "aws-amplify";
import awsconfig from "./aws-exports";

Amplify.configure(awsconfig);

まとめ

  • fetchAuthSession()は現在のセッション情報を取得する非同期関数。
  • 主にトークン(AccessToken / IdToken / RefreshToken)、一時的な認証情報(credentials)、Identity IDなどを取得できる。
  • ログインしていない状態では tokensundefined になるため、安全な取り扱いが重要
  • トークンはオブジェクトとして返されるため、.toString()で文字列化してから使用。
  • APIリクエストの Authorization ヘッダーに Bearer トークン をつけるのが一般的な使い方。
  • エラーになりやすいポイント(未ログイン、importミス、初期化忘れ)も明確に理解しておく。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?