Amazon CognitoとPythonで簡易的なシングルサインオンを実現する

こんにちは、デジタル戦略開発課のaaです。
本日は、スキルチェンジプロジェクトを経て、実業務においてAmazon Cognitoを利用する機会がありましたので、使用した際の手順について解説します。

 

1.Amazon Cognitoとは

Amazon Cognitoとは、アプリケーションの認証・認可を行うためのフルマネージドサービスです。
ユーザーのアカウント管理やアクセス制御(認証・認可)をAWS側で自動的に処理してくれます。さらに、Google・Amazon・Facebookなどの外部IDプロバイダーと連携できるため、たとえばGoogleアカウントを使ったログイン機能も簡単に実装できます。また、多要素認証(MFA)などの高度なセキュリティ機能にも対応しており、柔軟かつ安全なユーザー認証環境を構築できます。

2.今回どのように使用したか

今回は、別のシステムから認証サーバを経由して接続してきたアカウントに対し、再度認証を求めることがないようにするため、Cognitoを活用しました。すなわち、シングルサインオンの動作を実現させることが、目的になります。

既に認証済となっているアカウントであるため、自システムに対する認証(トークン発行)の際に、操作者側へのメールによる登録通知やパスワード再設定通知などをしないような実装を行っています。

3.実施手順

3-1.アカウントが既に登録されているか検索

    cognito_client = boto3.client("cognito-idp")
    # 連携アカウントをユーザ名として使用
    filter_str: str = 'username = "linked_account"'
    list_users_params: ListUsersRequestRequestTypeDef = {
        "UserPoolId": userpool_id,
        "Filter": filter_str,
    }
    res: ListUsersResponseTypeDef = cognito_client.list_users(**list_users_params)

    if not res["Users"]:
        # ユーザが存在しない
        return None

3-2.登録されていない場合、アカウント登録を行う

    cognito_client = boto3.client("cognito-idp")
    # 内部利用仮パスワード設定
    password = create_random_password()
    # ユーザ登録
    admin_create_user_params: AdminCreateUserRequestRequestTypeDef = {
        "UserPoolId": userpool_id,
        "Username": user_id,
        "TemporaryPassword": password,
        "MessageAction": "SUPPRESS",
    }
    cognito_client.admin_create_user(**admin_create_user_params)
    # パスワード設定
    admin_set_user_password_params: AdminSetUserPasswordRequestRequestTypeDef = {
        "UserPoolId": userpool_id,
        "Username": user_id,
        "Password": password,
        "Permanent": True,
    }
    cognito_client.admin_set_user_password(**admin_set_user_password_params)

3-3.トークンの取得を行う*1

 
 
    admin_initiate_auth_params: AdminInitiateAuthRequestRequestTypeDef = {
        "UserPoolId": userpool_id,
        "ClientId": client_id,
        "AuthFlow": "ADMIN_USER_PASSWORD_AUTH",
        "AuthParameters": {
            "USERNAME": user_id,
            "PASSWORD": password,
        },
    }
    cognito_client = boto3.client("cognito-idp")
    return_data: AdminInitiateAuthResponseTypeDef = cognito_client.admin_initiate_auth(
        **admin_initiate_auth_params
    )
 

4.最後に

今回のAmazon CognitoとPythonで簡易的なシングルサインオンを実現したプロジェクトでは、使用する前にそれをどのように使うかを実際に検証する機会となりました。特に、ユーザー登録後の確認ステータスの違いや、通知メールのカスタマイズ方法、そして3種類あるトークンの各用途に応じた使い分けについて、深く理解することができました。

 

5.参考

docs.aws.amazon.com

docs.aws.amazon.com

 

*1:トークン情報("AuthenticationResult")から"IdToken":IDトークンを取得 (他に"AccessToken":アクセストークン、"RefreshToken":リフレッシュトークンあり)

 

\株式会社シー・エス・エスは、新しい仲間を募集中♪/
資格取得も支援しています!詳しい職種紹介・募集要項はリクルートサイト

リクルートサイトへのリンク

6.この記事を書いた人

この記事を書いた人のプロフィール画像

ニックネーム:aa
経歴:入社25年目となります。主に金融・証券・銀行系のシステム開発運用業務に携わってまいりました。現在は金融系のシステム保守開発に従事しております。
一言:健康管理には気を付けたいと思っております。