DjangoでCognitoの利用 ~登録・認証~

本記事は、boto3を利用して行っている。

準備は以下記事を参照。

Cognitoへのユーザー登録

sign_up を使用して、ユーザーの情報を登録する。

cognito.sign_up(
    ClientId=[APP_CLIENT_ID],
    SecretHash=[ハッシュ値],
    Username=[ユーザー名],
    Password=[パスワード],
    UserAttributes=[付属情報],
);

設定次第では、登録したメールアドレスなどに、確認をコードが送信されるので、確認コードをCognitoへ送信する。

確認コードの送信

confirm_sign_up を使用して確認コードをCognitoへ送信することで、登録が完了する。

res = self.__cognito.confirm_sign_up(
    ClientId=[APP_CLIENT_ID],
    SecretHash=[ハッシュ値],
    Username=[ユーザー名],
    ConfirmationCode=[確認コード],
 );

認証

登録したユーザーを認証する。要するにログイン。

cognito.admin_initiate_auth(
    UserPoolId=[POOL_ID],
    ClientId=[APP_CLIENT_ID],

    AuthFlow = "ADMIN_USER_PASSWORD_AUTH",
    AuthParameters = {
        "USERNAME": [ユーザー名],
        "PASSWORD": [パスワード],
        "SECRET_HASH" : [ハッシュ値],
    }
);

リクエストが成功すると、結果としては、下記のような内容が返却される。

{
    'ChallengeName': 'SMS_MFA'|'SOFTWARE_TOKEN_MFA'|'SELECT_MFA_TYPE'|'MFA_SETUP'|'PASSWORD_VERIFIER'|'CUSTOM_CHALLENGE'|'DEVICE_SRP_AUTH'|'DEVICE_PASSWORD_VERIFIER'|'ADMIN_NO_SRP_AUTH'|'NEW_PASSWORD_REQUIRED',
    'Session': 'string',
    'ChallengeParameters': {
        'string': 'string'
    },
    'AuthenticationResult': {
        'AccessToken': 'string',
        'ExpiresIn': 123,
        'TokenType': 'string',
        'RefreshToken': 'string',
        'IdToken': 'string',
        'NewDeviceMetadata': {
            'DeviceKey': 'string',
            'DeviceGroupKey': 'string'
        }
    }
}

主に使用するのは、 IdTokenAccessTokenRefreshToken

IdToken

awsのサービスに使用できるトークン。
ユーザーの管理などに使用できるが、永続ではないため、サービス内の永続的なユーザーの識別子としては使用できない。

AccessToken

cognito上のユーザー情報を操作できるアクセス権

RefreshToken

AccessTokenの有効期限が切れてしまった場合に、再発行するときに使用する。

認証破棄

要するにログアウト。

cognito.revoke_token(
    Token=[リフレッシュトークン], 
    ClientId=[APP_CLIENT_ID], 
    ClientSecret=[APP_CLIENT_SECRET]
);

このリクエスト成功後は、各種tokenが無効になる。

参考

CognitoIdentityProvider — Boto3 Docs 1.26.22 documentation (amazonaws.com)