[AWS]CognitoのTokenを扱うライブラリ

Amazon Cognitoのトークンを操作するためのモジュールです。このモジュールは、トークンのデコードや有効期限の確認、アクセストークンの更新など、Amazon Cognitoのトークンに関する一般的な操作をサポートします。

## インポート

```python
import jwt
import time
import boto3
```

## クラス

### 1. CognitoAccessToken

アクセストークンを扱うためのクラスです。トークンをデコードし、有効期限の情報を取得します。

#### コンストラクタ

```python
def __init__(self, token):
```
- **パラメータ**: `token` (str) - デコードするアクセストークン。

#### メソッド

```python
def is_expired(self):
```
- **戻り値**: トークンの有効期限が切れていればTrue、それ以外の場合はFalse。

### 2. CognitoIdToken

IDトークンを扱うためのクラスです。トークンをデコードし、有効期限の情報を取得します。

#### コンストラクタ

```python
def __init__(self, token):
```
- **パラメータ**: `token` (str) - デコードするIDトークン。

#### メソッド

```python
def is_expired(self):
```
- **戻り値**: トークンの有効期限が切れていればTrue、それ以外の場合はFalse。

## 関数

### refresh_access_token

Amazon Cognitoのリフレッシュトークンを使用して、新しいアクセストークンを取得する関数です。

```python
def refresh_access_token(refresh_token, client_id):
```
- **パラメータ**: 
  - `refresh_token` (str) - 使用するリフレッシュトークン。
  - `client_id` (str) - CognitoユーザープールのクライアントID。
  
- **戻り値**: 新しいアクセストークン。

このモジュールを利用することで、Amazon Cognitoのトークンの操作を簡単かつ効率的に行うことができます。適切な方法で利用してください。


## ソースコード

```python
import jwt
import time
import boto3


class CognitoAccessToken:
    """Represents a decoded Cognito access token.
    
    Attributes:
        token (str): The raw access token.
        payload (dict): The decoded payload of the token.
        sub (str): The subject of the token, typically the user's ID.
        username (str): The username associated with the token.
    """

    def __init__(self, token):
        """Initialize the CognitoAccessToken object with the provided token.
        
        Args:
            token (str): The access token to decode.
        """
        self.token = token
        self.payload = jwt.decode(token, options={"verify_signature": False})
        self.sub = self.payload["sub"]
        self.username = self.payload["username"]

    def is_expired(self):
        """Determine if the access token has expired.
        
        Returns:
            bool: True if the token has expired, otherwise False.
        """
        current_time = int(time.time())
        return current_time > self.payload["exp"]

def refresh_access_token(refresh_token, client_id):
    """Refresh the Cognito access token using the provided refresh token and client ID.
    
    Args:
        refresh_token (str): The refresh token.
        client_id (str): The client ID associated with the Cognito user pool.
        
    Returns:
        str: The new access token.
    """
    client = boto3.client("cognito-idp")
    response = client.initiate_auth(
        AuthFlow="REFRESH_TOKEN_AUTH",
        AuthParameters={"REFRESH_TOKEN": refresh_token},
        ClientId=client_id,
    )
    access_token = response["AuthenticationResult"]["AccessToken"]
    return access_token

class CognitoIdToken:
    """Represents a decoded Cognito ID token.
    
    Attributes:
        token (str): The raw ID token.
        payload (dict): The decoded payload of the token.
        sub (str): The subject of the token, typically the user's ID.
    """

    def __init__(self, token):
        """Initialize the CognitoIdToken object with the provided token.
        
        Args:
            token (str): The ID token to decode.
        """
        self.token = token
        self.payload = jwt.decode(token, options={"verify_signature": False})
        self.sub = self.payload["sub"]

    def is_expired(self):
        """Determine if the ID token has expired.
        
        Returns:
            bool: True if the token has expired, otherwise False.
        """
        current_time = int(time.time())
        return current_time > self.payload["exp"]

```