【Android/Java】Cognitoで認証をするときのメモ

## Cognitoでユーザーのセッション状態を確認する
```java
try {
    // Amplify プラグインの追加と初期化
    Amplify.addPlugin(new AWSCognitoAuthPlugin());
    Amplify.configure(getApplicationContext());
    Log.i("MyAmplifyApp", "Initialized Amplify");

    // ログイン状態の確認
    Amplify.Auth.fetchAuthSession(
      result -> Log.i("AmplifyQuickstart", result.toString()),
      error -> Log.e("AmplifyQuickstart", error.toString())
    );
} catch (AmplifyException error) {
    Log.e("MyAmplifyApp", "Could not initialize Amplify", error);
}
```

#### 細かく見ていく

- Amplify プラグインの追加と初期化
```java
Amplify.addPlugin(new AWSCognitoAuthPlugin());
Amplify.configure(getApplicationContext());
Log.i("MyAmplifyApp", "Initialized Amplify");
```
AWS Amplify ライブラリに Auth プラグイン（AWS Cognito 認証プラグイン）を追加し、Amplify を初期化する。
`Amplify.configure()` メソッドは、Amplify ライブラリの初期化を行う。
まず、この処理をしていないと認証処理を実行するところでエラーになる。

- ログイン状態の確認
 ```java
Amplify.Auth.fetchAuthSession(
    result -> Log.i("AmplifyQuickstart", result.toString()),
    error -> Log.e("AmplifyQuickstart", error.toString())
);
```
`fetchAuthSession()` メソッドは、現在のユーザーセッションの状態を取得する。
成功した場合、`result` オブジェクトにセッション情報が含まれる。
エラーが発生した場合は、`error` オブジェクトにエラー情報が含まれる。

- エラーハンドリング
```java
} catch (AmplifyException error) {
    Log.e("MyAmplifyApp", "Could not initialize Amplify", error);
}
```
Amplify ライブラリの初期化中にエラーが発生した場合、AmplifyException がスローされ、その詳細をログに出力する。


## セッション状態から認証済みユーザーのidTokenを取得する

```java
Amplify.Auth.fetchAuthSession(
    // ユーザーセッションの取得が成功した場合の処理
    result -> {
        AWSCognitoAuthSession cognitoAuthSession = (AWSCognitoAuthSession) sessionResult;
        switch (cognitoAuthSession.getUserPoolTokensResult().getType()) {
            case SUCCESS:
                // ユーザーセッションの取得に成功した場合
                assert cognitoAuthSession.getUserPoolTokensResult().getValue() != null;
                String idToken = cognitoAuthSession.getUserPoolTokensResult().getValue().getIdToken();

                // idTokenを使用した処理
                break;
            
            case FAILURE:
                // ユーザーセッションの取得に失敗した場合
                // エラー処理
                break;
        }
    },
    error -> // エラー処理
);
```

#### 細かく見ていく
- セッションの状態を確認する
```java
 result -> {
        AWSCognitoAuthSession cognitoAuthSession = (AWSCognitoAuthSession) sessionResult;
        switch (cognitoAuthSession.getUserPoolTokensResult().getType()) {
    
```
`result` パラメータは、ユーザーセッションの情報を含むオブジェクト。
このオブジェクトをキャストして `AWSCognitoAuthSession` オブジェクトに変換する。
次に、`cognitoAuthSession.getUserPoolTokensResult().getType()` を使用してセッションの状態を確認することができる。

- ID トークンを取得
```java
    case SUCCESS:
        // ユーザーセッションの取得に成功した場合
        assert cognitoAuthSession.getUserPoolTokensResult().getValue() != null;
        String idToken = cognitoAuthSession.getUserPoolTokensResult().getValue().getIdToken();

        // idTokenを使用した処理
        break;
```
ユーザーセッションの取得が成功(`case SUCCESS`)した場合、
`cognitoAuthSession.getUserPoolTokensResult().getValue().getIdToken()` を使用して ID トークンが取得できる。
これは、認証済みユーザーの識別子。
取得した ID トークンを使用した処理を実装したい時はこうやって取得する。

## おわりに
AndroidアプリでCognitoを使用した際に`idToken`の取得に手こずったのでメモを残してみました。

Cognitoのユーザープールの設定とかアプリとの紐付けとかでも大変苦戦したので、AWS Cognitoのセットアップの記事も今後書きたいと思ってます！

認証機能がんばるぞい！


## 参考記事
- https://docs.amplify.aws/lib/auth/access_credentials/q/platform/android/