0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OAuth2.0認証を用いたAWS CDK(Python)によるCRUD APIの構築

Posted at

はじめに

前回の記事では、AWS CDK(Python)を活用して、DynamoDB、Lambda、およびAPI Gatewayを組み合わせた柔軟性の高いCRUD APIを構築し、IPアドレス制限およびAPIキー認証を設定する方法について解説しました。さらに、JWT(JSON Web Token)認証を導入する方法も紹介しました。

今回は、さらに高度な認証手法としてOAuth2.0認証を導入する方法を詳しく説明します。OAuth2.0は、ユーザー認証と認可をセキュアかつスケーラブルに管理するための強力な手段です。

OAuth2.0認証とは

OAuth2.0認証は、第三者アプリケーションがユーザーのリソースにアクセスするための標準的な認証プロトコルです。OAuth2.0は、認証と認可を分離し、セキュリティを強化しつつ、ユーザーエクスペリエンスを向上させることを目的としています。

主な特徴:

  • 認証と認可の分離: OAuth2.0は、ユーザーの認証(誰がアクセスしているか)と認可(何にアクセスできるか)を分離します。
  • スケーラブル: 大規模なシステムや分散型アーキテクチャに適しています。
  • セキュア: トークンベースの認証により、クレデンシャルの漏洩リスクを低減します。
  • 柔軟性: 様々な認証フロー(認可コードフロー、インプリシットフロー、クライアントクレデンシャルフローなど)をサポートします。

注意点:

  • 複雑さ: 設定や管理が他の認証方式に比べて複雑です。
  • セキュリティ: トークンの適切な管理と保護が必要です。

プロジェクトのセットアップと前提条件

前回の記事で構築したプロジェクトを基に、OAuth2.0認証を導入します。以下の前提条件が満たされていることを確認してください。

  1. 前回の記事のセットアップ完了: APIキー認証およびJWT認証を設定したCRUD APIが既に構築・デプロイされていること。
  2. AWS CLIの設定: 適切に設定されていること。
  3. AWS CDKのインストール: 最新バージョンがインストールされていること。
  4. Python仮想環境のアクティブ化: 前回と同様に設定されていること。
  5. AWS Cognitoの基本理解: ユーザープールとアプリクライアントの基本的な概念を理解していること。

AWS Cognitoの設定

OAuth2.0認証を実現するために、AWS Cognitoを利用します。Cognitoは、ユーザー管理、認証、認可を提供するマネージドサービスです。

1. Cognitoユーザープールの作成

Cognitoユーザープールは、ユーザーの登録やログインを管理するためのサービスです。

手動での設定(AWSマネジメントコンソールを使用)

  1. AWSマネジメントコンソールにログイン。
  2. Cognitoサービスに移動。
  3. Manage User Poolsを選択し、Create a user poolをクリック。
  4. Pool nameに「CRUDApiUserPool」と入力し、Review defaultsを選択。
  5. 必要に応じて設定を変更し、Create poolをクリック。

CDKを使用した設定(推奨)

CognitoユーザープールをCDKスタックに統合することで、インフラストラクチャをコードとして管理できます。次節で詳しく説明します。

2. Cognitoアプリクライアントの作成

アプリクライアントは、ユーザープールに対するアプリケーションの接続ポイントです。OAuth2.0フローを利用するために、アプリクライアントを適切に設定します。

手動での設定(AWSマネジメントコンソールを使用)

  1. AWSマネジメントコンソールにログイン。
  2. Cognitoサービスに移動。
  3. 作成したCRUDApiUserPoolを選択。
  4. App clientsタブを選択し、Add an app clientをクリック。
  5. App client nameに「CRUDApiClient」と入力し、Generate client secretをオフにします。
  6. Enabled Identity Providersで「Cognito User Pool」を選択。
  7. OAuth 2.0セクションで以下を設定:
    • Allowed OAuth Flows: Authorization code grant を選択。
    • Allowed OAuth Scopes: openid, profile, email を選択。
    • Callback URLs: https://localhost/callback など、適切なリダイレクトURLを設定。
    • Logout URLs: https://localhost/logout などを設定。
  8. Create app clientをクリック。

CDKを使用した設定(推奨)

CognitoアプリクライアントをCDKスタックに統合します。次節で詳しく説明します。

3. ドメインの設定

OAuth2.0フローでは、ユーザーが認証するためのCognitoドメインが必要です。ドメインを設定することで、認証ページへのアクセスが可能になります。

手動での設定(AWSマネジメントコンソールを使用)

  1. AWSマネジメントコンソールにログイン。
  2. Cognitoサービスに移動。
  3. 作成したCRUDApiUserPoolを選択。
  4. App integrationタブを選択し、Domain nameセクションを見つけます。
  5. Set domainをクリックし、Domain prefixに「crudapi-domain」と入力します。
  6. Save changesをクリック。

CDKを使用した設定(推奨)

CognitoドメインをCDKスタックに統合します。次節で詳しく説明します。

4. リダイレクトURLの設定

OAuth2.0フローでは、認証後にユーザーがリダイレクトされるURLを設定する必要があります。これにより、認証後のトークン取得が可能になります。

手動での設定(AWSマネジメントコンソールを使用)

  1. AWSマネジメントコンソールにログイン。
  2. Cognitoサービスに移動。
  3. 作成したCRUDApiUserPoolを選択。
  4. App integrationタブを選択。
  5. App client settingsをクリック。
  6. Enabled Identity Providersで「Cognito User Pool」を選択。
  7. Callback URLsにリダイレクトURLを追加(例: https://localhost/callback)。
  8. Sign out URLsにログアウトURLを追加(例: https://localhost/logout)。
  9. OAuth 2.0セクションで以下を設定:
    • Allowed OAuth Flows: Authorization code grant を選択。
    • Allowed OAuth Scopes: openid, profile, email を選択。
  10. Save changesをクリック。

CDKスタックの更新

OAuth2.0認証を導入するために、CDKスタックを以下のように更新します。主な変更点は、Cognitoユーザープールの作成、Cognitoアプリクライアントの作成、Cognitoドメインの設定、およびAPI GatewayへのCognitoオーソライザーの適用です。

1. Cognitoユーザープールとアプリクライアントの統合

cdk_crud_api_python/cdk_crud_api_python_stack.py を以下のように更新します。

from aws_cdk import (
    Stack,
    aws_dynamodb as dynamodb,
    aws_lambda as _lambda,
    aws_apigateway as apigateway,
    aws_cognito as cognito,
    aws_iam as iam,
    RemovalPolicy
)
from constructs import Construct
import os
from dotenv import load_dotenv

load_dotenv()

class CdkCrudApiPythonStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        
        # 環境変数からDynamoDBのキー設定を取得
        partition_key = os.getenv("DYNAMODB_PARTITION_KEY", "id")
        sort_key = os.getenv("DYNAMODB_SORT_KEY")  # 必要に応じて設定
        
        # DynamoDBテーブルの作成
        table = dynamodb.Table(
            self, "ItemsTable",
            partition_key=dynamodb.Attribute(
                name=partition_key,
                type=dynamodb.AttributeType.STRING
            ),
            sort_key=dynamodb.Attribute(name=sort_key, type=dynamodb.AttributeType.STRING) if sort_key else None,
            billing_mode=dynamodb.BillingMode.PAY_PER_REQUEST,
            removal_policy=RemovalPolicy.DESTROY  # 開発環境用。プロダクションでは注意
        )
        
        # Cognitoユーザープールの作成
        user_pool = cognito.UserPool(
            self, "UserPool",
            user_pool_name="CRUDApiUserPool",
            self_sign_up_enabled=True,
            sign_in_aliases=cognito.SignInAliases(username=True, email=True),
            auto_verify=cognito.AutoVerifiedAttrs(email=True),
            standard_attributes=cognito.StandardAttributes(
                email=cognito.StandardAttribute(required=True, mutable=False)
            ),
            removal_policy=RemovalPolicy.DESTROY  # 開発環境用。プロダクションでは注意
        )
        
        # Cognitoアプリクライアントの作成
        user_pool_client = cognito.UserPoolClient(
            self, "UserPoolClient",
            user_pool=user_pool,
            generate_secret=False,
            auth_flows=cognito.AuthFlow(
                user_password=True,
                user_srp=True
            ),
            o_auth=cognito.OAuthSettings(
                flows=cognito.OAuthFlows(
                    authorization_code_grant=True
                ),
                scopes=[cognito.OAuthScope.OPENID, cognito.OAuthScope.PROFILE, cognito.OAuthScope.EMAIL],
                callback_urls=["https://localhost/callback"],
                logout_urls=["https://localhost/logout"]
            )
        )
        
        # Cognitoドメインの設定
        user_pool_domain = user_pool.add_domain("CognitoDomain",
            cognito_domain=cognito.CognitoDomainOptions(
                domain_prefix="crudapi-domain"
            )
        )
        
        # Lambda関数の作成
        crud_lambda = _lambda.Function(
            self, "CrudFunction",
            runtime=_lambda.Runtime.PYTHON_3_9,
            handler="index.handler",
            code=_lambda.Code.from_asset("lambda"),
            environment={
                "TABLE_NAME": table.table_name
            }
        )
        
        # LambdaにDynamoDBへのアクセス権限を付与
        table.grant_read_write_data(crud_lambda)
        
        # API Gatewayの作成
        api = apigateway.RestApi(
            self, "CrudApi",
            rest_api_name="CRUD Service",
            description="This service serves CRUD operations.",
            default_cors_preflight_options=apigateway.CorsOptions(
                allow_origins=apigateway.Cors.ALL_ORIGINS,
                allow_methods=apigateway.Cors.ALL_METHODS
            )
        )
        
        # Cognitoオーソライザーの作成
        authorizer = apigateway.CognitoUserPoolsAuthorizer(
            self, "CognitoAuthorizer",
            cognito_user_pools=[user_pool]
        )
        
        # APIリソースとメソッドの設定
        items = api.root.add_resource("items")
        items.add_method(
            "GET",
            apigateway.LambdaIntegration(crud_lambda),
            authorization_type=apigateway.AuthorizationType.COGNITO,
            authorizer=authorizer
        )
        items.add_method(
            "POST",
            apigateway.LambdaIntegration(crud_lambda),
            authorization_type=apigateway.AuthorizationType.COGNITO,
            authorizer=authorizer
        )
        
        single_item = items.add_resource("{id}")
        single_item.add_method(
            "GET",
            apigateway.LambdaIntegration(crud_lambda),
            authorization_type=apigateway.AuthorizationType.COGNITO,
            authorizer=authorizer
        )
        single_item.add_method(
            "PUT",
            apigateway.LambdaIntegration(crud_lambda),
            authorization_type=apigateway.AuthorizationType.COGNITO,
            authorizer=authorizer
        )
        single_item.add_method(
            "DELETE",
            apigateway.LambdaIntegration(crud_lambda),
            authorization_type=apigateway.AuthorizationType.COGNITO,
            authorizer=authorizer
        )

主な変更点:

  1. Cognitoユーザープールの作成:

    user_pool = cognito.UserPool(
        self, "UserPool",
        user_pool_name="CRUDApiUserPool",
        self_sign_up_enabled=True,
        sign_in_aliases=cognito.SignInAliases(username=True, email=True),
        auto_verify=cognito.AutoVerifiedAttrs(email=True),
        standard_attributes=cognito.StandardAttributes(
            email=cognito.StandardAttribute(required=True, mutable=False)
        ),
        removal_policy=RemovalPolicy.DESTROY  # 開発環境用。プロダクションでは注意
    )
    
    • ユーザープール名を「CRUDApiUserPool」に設定。
    • 自己サインアップを有効化。
    • サインインエイリアスとしてユーザー名とメールを許可。
    • メールの自動検証を有効化。
    • 標準属性としてメールを必須・不変に設定。
  2. Cognitoアプリクライアントの作成:

    user_pool_client = cognito.UserPoolClient(
        self, "UserPoolClient",
        user_pool=user_pool,
        generate_secret=False,
        auth_flows=cognito.AuthFlow(
            user_password=True,
            user_srp=True
        ),
        o_auth=cognito.OAuthSettings(
            flows=cognito.OAuthFlows(
                authorization_code_grant=True
            ),
            scopes=[cognito.OAuthScope.OPENID, cognito.OAuthScope.PROFILE, cognito.OAuthScope.EMAIL],
            callback_urls=["https://localhost/callback"],
            logout_urls=["https://localhost/logout"]
        )
    )
    
    • アプリクライアントを作成し、秘密鍵の生成を無効化。
    • 認証フローとして認可コードグラントフローを有効化。
    • OAuthスコープとしてopenidprofileemailを選択。
    • リダイレクトURLログアウトURLを設定。
  3. Cognitoドメインの設定:

    user_pool_domain = user_pool.add_domain("CognitoDomain",
        cognito_domain=cognito.CognitoDomainOptions(
            domain_prefix="crudapi-domain"
        )
    )
    
    • Cognitoドメインを「crudapi-domain」に設定。
    • このドメインを使用して認証ページにアクセスします。
  4. Cognitoオーソライザーの作成:

    authorizer = apigateway.CognitoUserPoolsAuthorizer(
        self, "CognitoAuthorizer",
        cognito_user_pools=[user_pool]
    )
    
    • API Gateway用のCognitoオーソライザーを作成し、作成したユーザープールを指定。
  5. APIメソッドへの認証の適用:

    items.add_method(
        "GET",
        apigateway.LambdaIntegration(crud_lambda),
        authorization_type=apigateway.AuthorizationType.COGNITO,
        authorizer=authorizer
    )
    
    • 各APIメソッドに対して、認証タイプCOGNITOに設定し、作成したオーソライザーを適用。

Lambda関数の更新

今回の変更では、Lambda関数側でOAuth2.0認証を直接処理する必要はありません。認証はAPI Gatewayが行い、認証済みのリクエストのみがLambda関数に渡されます。ただし、必要に応じてLambda関数内でユーザー情報を取得・利用することができます。

1. Lambdaディレクトリの作成

前回の記事で既にlambdaフォルダを作成している場合は、このステップは不要です。まだ作成していない場合は、プロジェクトのルートディレクトリにlambdaフォルダを作成し、その中にindex.pyファイルを作成します。

mkdir lambda
touch lambda/index.py

2. Lambdaハンドラーの実装

lambda/index.pyに以下のコードを追加します。これは、DynamoDBテーブルへのCRUD操作を実装したLambdaハンドラーの完全な例です。OAuth2.0認証はAPI Gatewayが処理するため、Lambda関数側では特別な認証処理は不要です。ただし、ユーザー情報を取得する場合は、イベントオブジェクトからユーザー情報を参照できます。

import json
import os
import boto3
import uuid

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(os.environ['TABLE_NAME'])

def handler(event, context):
    http_method = event['httpMethod']
    resource = event['resource']
    path_parameters = event.get('pathParameters', {})
    item_id = path_parameters.get('id') if path_parameters else None

    # Cognitoユーザー情報の取得(オプション)
    user_info = get_user_info(event)
    
    try:
        if resource == "/items" and http_method == "GET":
            # 全アイテムの取得
            response = table.scan()
            return {
                "statusCode": 200,
                "body": json.dumps(response.get('Items', []))
            }

        elif resource == "/items" and http_method == "POST":
            # 新しいアイテムの作成
            body = json.loads(event['body'])
            if 'id' not in body:
                body['id'] = generate_id()
            # 作成者情報の追加(オプション)
            body['created_by'] = user_info.get('username') if user_info else "anonymous"
            table.put_item(Item=body)
            return {
                "statusCode": 201,
                "body": json.dumps(body)
            }

        elif resource == "/items/{id}" and http_method == "GET":
            # 単一アイテムの取得
            response = table.get_item(Key={'id': item_id})
            item = response.get('Item')
            if item:
                return {
                    "statusCode": 200,
                    "body": json.dumps(item)
                }
            else:
                return {
                    "statusCode": 404,
                    "body": json.dumps({"message": "Item not found"})
                }

        elif resource == "/items/{id}" and http_method == "PUT":
            # アイテムの更新
            body = json.loads(event['body'])
            body['id'] = item_id
            # 更新者情報の追加(オプション)
            body['updated_by'] = user_info.get('username') if user_info else "anonymous"
            table.put_item(Item=body)
            return {
                "statusCode": 200,
                "body": json.dumps(body)
            }

        elif resource == "/items/{id}" and http_method == "DELETE":
            # アイテムの削除
            table.delete_item(Key={'id': item_id})
            return {
                "statusCode": 204,
                "body": ""
            }

        else:
            return {
                "statusCode": 405,
                "body": json.dumps({"message": "Method Not Allowed"})
            }

    except Exception as e:
        print(e)
        return {
            "statusCode": 500,
            "body": json.dumps({"message": "Internal Server Error"})
        }

def generate_id():
    return str(uuid.uuid4())

def get_user_info(event):
    """
    Cognitoユーザー情報を取得します。
    API GatewayのCognitoオーソライザーを使用している場合、ユーザー情報はeventオブジェクトに含まれています。
    """
    try:
        authorizer = event['requestContext']['authorizer']
        claims = authorizer['claims']
        return {
            "username": claims.get('cognito:username'),
            "email": claims.get('email')
        }
    except KeyError:
        return None

ポイント解説:

  • Cognitoユーザー情報の取得:

    def get_user_info(event):
        try:
            authorizer = event['requestContext']['authorizer']
            claims = authorizer['claims']
            return {
                "username": claims.get('cognito:username'),
                "email": claims.get('email')
            }
        except KeyError:
            return None
    
    • API GatewayのCognitoオーソライザーを使用している場合、event['requestContext']['authorizer']['claims']にユーザー情報が含まれています。
    • cognito:usernameemailなどのクレームを取得して、作成者や更新者の情報として利用できます。
  • CRUD操作の実装:

    • 各HTTPメソッドとリソースパスに応じて、DynamoDBテーブルに対する操作を行います。
    • POST /itemsでは、作成者情報を追加。
    • **PUT /items/{id}**では、更新者情報を追加。
  • エラーハンドリング:

    except Exception as e:
        print(e)
        return {
            "statusCode": 500,
            "body": json.dumps({"message": "Internal Server Error"})
        }
    
    • 例外が発生した場合、500 Internal Server Errorを返します。デバッグのためにエラーをログ出力しています。

デプロイとテスト

1. CDKスタックのデプロイ

更新したCDKスタックをデプロイします。

cdk deploy

デプロイが成功すると、API GatewayのエンドポイントURLとCognitoユーザープールの情報が表示されます。

2. Cognitoユーザーの登録とトークンの取得

1. ユーザーの登録

ユーザープールにユーザーを登録します。AWSマネジメントコンソールを使用するか、AWS CLIを使用して登録できます。

AWSマネジメントコンソールを使用する場合:

  1. AWSマネジメントコンソールにログイン。
  2. Cognitoサービスに移動。
  3. 作成したCRUDApiUserPoolを選択。
  4. Users and groupsタブを選択し、Create userをクリック。
  5. 必要な情報(ユーザー名、メールアドレスなど)を入力し、Create userをクリック。

AWS CLIを使用する場合:

aws cognito-idp admin-create-user \
    --user-pool-id YOUR_USER_POOL_ID \
    --username your_username \
    --user-attributes Name=email,Value=your_email@example.com

2. JWTトークンの取得

ユーザー登録後、JWTトークン(IDトークンとアクセストークン)を取得します。以下は、AWS CLIを使用してトークンを取得する例です。

aws cognito-idp initiate-auth \
    --auth-flow USER_PASSWORD_AUTH \
    --client-id YOUR_USER_POOL_CLIENT_ID \
    --auth-parameters USERNAME=your_username,PASSWORD=your_password

出力例:

{
    "AuthenticationResult": {
        "AccessToken": "eyJraWQiOiJr...",
        "ExpiresIn": 3600,
        "IdToken": "eyJraWQiOiJr...",
        "RefreshToken": "eyJjdHkiOiJKV1QiLCJ...",
        "TokenType": "Bearer"
    }
}
  • AccessToken: 認可情報を含むトークン。API Gatewayでの認証に使用します。
  • IdToken: ユーザー情報を含むトークン。Lambda関数でユーザー情報を取得する際に使用します。
  • RefreshToken: トークンの再取得に使用します。

3. OAuth2.0フローの実行

OAuth2.0認証フロー(認可コードグラントフロー)を実行するために、ユーザーを認証ページにリダイレクトし、認証後に取得したコードを使用してトークンを取得します。

1. 認証URLの構築

以下のURLにユーザーをリダイレクトします。YOUR_DOMAINYOUR_CLIENT_IDYOUR_REDIRECT_URIを適切に置き換えてください。

https://YOUR_DOMAIN.auth.YOUR_REGION.amazoncognito.com/login?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI

例:

https://crudapi-domain.auth.ap-northeast-1.amazoncognito.com/login?response_type=code&client_id=abcd1234&redirect_uri=https://localhost/callback

2. 認証後のリダイレクトとトークンの取得

ユーザーが認証ページで認証を完了すると、指定したリダイレクトURLにコードが含まれてリダイレクトされます。このコードを使用してトークンを取得します。

curl -X POST https://YOUR_DOMAIN.auth.YOUR_REGION.amazoncognito.com/oauth2/token \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "grant_type=authorization_code&client_id=YOUR_CLIENT_ID&code=YOUR_AUTH_CODE&redirect_uri=YOUR_REDIRECT_URI"

出力例:

{
    "access_token": "eyJraWQiOiJr...",
    "expires_in": 3600,
    "id_token": "eyJraWQiOiJr...",
    "refresh_token": "eyJjdHkiOiJKV1QiLCJ...",
    "token_type": "Bearer"
}

4. APIのテスト方法

JWTトークンを使用してAPIにアクセスする際は、リクエストヘッダーにAuthorizationを含めます。以下にcurlコマンドを使用したテスト方法を示します。

1. 全アイテムの取得 (GET /items)

curl -X GET https://your-api-id.execute-api.region.amazonaws.com/prod/items \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

2. 新しいアイテムの作成 (POST /items)

curl -X POST https://your-api-id.execute-api.region.amazonaws.com/prod/items \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -d '{"name": "Item Name", "description": "Item Description"}'

3. 単一アイテムの取得 (GET /items/{id})

curl -X GET https://your-api-id.execute-api.region.amazonaws.com/prod/items/<item_id> \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

4. アイテムの更新 (PUT /items/{id})

curl -X PUT https://your-api-id.execute-api.region.amazonaws.com/prod/items/<item_id> \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -d '{"name": "Updated Name", "description": "Updated Description"}'

5. アイテムの削除 (DELETE /items/{id})

curl -X DELETE https://your-api-id.execute-api.region.amazonaws.com/prod/items/<item_id> \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

OAuth2.0トークンが無効または提供されていない場合:
リクエストは401 Unauthorizedエラーを返します。適切なJWTトークンをヘッダーに含める必要があります。


最終的なディレクトリ構成

プロジェクト全体の最終的なディレクトリ構成は以下の通りです。

cdk-crud-api-python/
├── app.py
├── cdk_crud_api_python
│   ├── __init__.py
│   └── cdk_crud_api_python_stack.py
├── lambda
│   └── index.py
├── requirements.txt
├── .gitignore
├── README.md
├── cdk.json
└── .env

各ファイル・フォルダの役割:

  • app.py: CDKアプリケーションのエントリーポイント。
  • cdk_crud_api_python/: CDKスタックの定義が含まれるパッケージ。
    • init.py: パッケージ初期化ファイル。
    • cdk_crud_api_python_stack.py: DynamoDB、Lambda、API Gateway、Cognitoを定義するスタックファイル。
  • lambda/: Lambda関数のコードが含まれるディレクトリ。
    • index.py: CRUDロジックを実装したLambdaハンドラー。
  • requirements.txt: Pythonの依存関係リスト。
  • .gitignore: Gitで追跡しないファイル・フォルダを指定。
  • README.md: プロジェクトの説明や使用方法を記載。
  • cdk.json: CDKの設定ファイル。
  • .env: 環境変数を定義するファイル(セキュリティに注意)。

まとめ

今回のガイドでは、AWS CDK(Python)を使用して構築したCRUD APIOAuth2.0認証を導入する方法を詳しく解説しました。
AWS Cognitoを活用することで、ユーザー管理と認証を簡単に実現し、セキュアなAPIアクセスを提供できます。

ポイントまとめ:

  • Cognitoユーザープールの作成と設定: ユーザー登録、認証フローを設定し、アプリクライアントを作成。
  • Cognitoドメインの設定: ユーザーが認証ページにアクセスするためのドメインを設定。
  • API Gatewayへの認証適用: Cognitoオーソライザーを使用して、APIメソッドに認証を適用。
  • Lambda関数の柔軟な対応: Lambda関数内でユーザー情報を取得・利用可能。
  • セキュリティの向上: OAuth2.0を利用することで、セッション管理を不要にし、スケーラブルな認証を実現。

次のステップ:

  • トークンのリフレッシュ機能の実装: OAuth2.0トークンの有効期限を管理し、リフレッシュトークンを利用してセッションを維持。
  • 追加の認可ロジックの実装: ユーザーの役割や権限に基づいたアクセス制御を実装。
  • モニタリングとロギングの強化: AWS CloudWatchや他のモニタリングツールを利用して、APIの使用状況やセキュリティインシデントを監視。
  • セキュリティベストプラクティスの適用: 適切なアクセス制御、暗号化、監査ログの管理などを実施。

このガイドを参考に、ぜひ自分のプロジェクトにOAuth2.0認証を導入し、よりセキュアでスケーラブルなAPIを提供してみてください。
必要に応じて、さらなる認証・認可の強化を行い、堅牢なAPIエコシステムを構築していきましょう!


参考資料


注記: セキュリティの観点から、.envファイルには機密情報を含めないようにし、必要に応じてAWS Secrets Managerなどのサービスを利用して機密情報を管理してください。また、OAuth2.0トークンは適切に管理し、不正アクセスを防止するために定期的にトークンの有効期限を設定・更新することを推奨します。

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?