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



## 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`を使って呼び出します。認証状態に応じて、取得できる内容が変わります。

### 最小限の使い方

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

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

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

### sessionオブジェクトの中身

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

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

#### トークンの取り出し方

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

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

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

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

```ts
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ヘッダーに付与**したり、**ユーザー認証状態のチェック**に使ったりします。
### アクセストークンの取得

```ts
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()`で安全に文字列を取り出しています。
- 未ログイン状態では`tokens`が`undefined`になる可能性があるため、オプショナルチェーン（`?.`）を使います。
- トークンが取得できないときはnullを返すようにしておくと、API通信時に条件分岐しやすくなります。


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

```ts
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 | トークンの再取得 | 有効期限を超えてアクセストークンを再取得する |

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

```ts
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でエラーになる |
| 未ログインチェックを必ず入れる | `tokens`が`undefined`のケースに備える |
| トークンの保存は注意 | セキュリティ上、トークンは**localStorageなどに保存しない方が安全**です。必要であればメモリ上（Contextなど）で保持します |



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

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

### 1：`tokens is undefined`

#### ■ 現象：
```ts
TypeError: Cannot read properties of undefined (reading 'accessToken')
```

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

#### 対処法：
- 必ず`tokens`の存在チェックを行ってからアクセスするようにします。

```ts
const session = await fetchAuthSession();

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

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

### 2：`fetchAuthSession is not a function`

#### ■ 現象：
```ts
TypeError: fetchAuthSession is not a function
```

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

#### 対処法：
```ts
// 間違った書き方
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など）

```ts
const token = session.tokens?.accessToken?.toString();

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


### エラー4：Amplify未初期化

#### ■ 現象：
```ts
Amplify has not been configured correctly
```

#### ■ 原因：
- `Amplify.configure()`が呼ばれていない、もしくは設定が不完全。

#### 対処法：
- アプリの最初（`index.tsx`や`main.tsx`）で確実にAmplifyを初期化してください。

```ts
import { Amplify } from "aws-amplify";
import awsconfig from "./aws-exports";

Amplify.configure(awsconfig);
```



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