Windows Forms 앱 인증에 Cognito를 사용해 보았습니다.

개요



Cognito에서 준비한 계정으로 Windows Form 앱에 로그인합니다.
로그인을 통과하면 Cognito에서 AWS 계정(S3 참조 권한 포함)을 받습니다.
S3 버킷 목록을 표시합니다.


전제



일련의 인증을 할 수 있는 형태를 Cognito로 만들어 둔다↓
Cognito 임베디드 웹 페이지 + S3에서만 동적 사이트 만들기

여기에는 다음 매개 변수가 필요합니다.


매개변수



사용자 풀 ID
us-east-1_hhogehogeh

애플리케이션 클라이언트 ID
4ks0na9rghogehogehoge0l

ID 풀 ID
us-east-1:7864a4bf-8045-4221-a280-hogehogehoge


그리고 S3 버킷도 준비해 둡니다.

출처



폼 디자인은 ↓ 이런 느낌


ID와 비밀번호를 입력하고 Login 버튼을 누르면 무언가가 일어나는 느낌으로 둡니다.

로그인 버튼 클릭시 비동기적으로 실행합니다.
/*
  ここで使う変数
 wwRegion :: Cognitoのリージョン
  wwUserPoolID  ::CognitoのユーザプールID
  wwAppClientID ::CognitoのアプリケーションクライアントID
  txtID.Text    ::フォーム上のIDテキストボックス
  txtPass.Text  ::フォーム上のPasswordテキストボックス
  wwIdPoolID    ::CognitoのIDプールのID
  wwS3BucketName::S3バケット名

*/

private async void btnLogin_ClickAsync(object sender, EventArgs e)
{
        AmazonCognitoIdentityProviderClient provider = new AmazonCognitoIdentityProviderClient(new Amazon.Runtime.AnonymousAWSCredentials(), wwRegion);
        CognitoUserPool userPool = new CognitoUserPool(wwUserPoolID, wwAppClientID, provider);
        CognitoUser user = new CognitoUser(txtID.Text, wwAppClientID, userPool, provider);
        InitiateSrpAuthRequest authRequest = new InitiateSrpAuthRequest()
        {
            Password = txtPass.Text
        };

        AuthFlowResponse authResponse = await user.StartWithSrpAuthAsync(authRequest).ConfigureAwait(false);
        string idToken = authResponse.AuthenticationResult.IdToken;

        CognitoAWSCredentials credentials = new CognitoAWSCredentials(
            wwIdPoolID, // ID プールの ID
            wwRegion    // リージョン
        );

        credentials.AddLogin("cognito-idp.us-east-1.amazonaws.com/" + wwUserPoolID, idToken); // the raw token
        //↓おまじない
        string hoge = await credentials.GetIdentityIdAsync();

        //ここから下は、通常のAPIの利用方法
        using (var client = new AmazonS3Client(credentials, wwRegion))
        {
            var S3Request = new ListObjectsRequest();
           S3Request.BucketName = wwS3BucketName;
            var S3Response = await client.ListObjectsAsync(S3Request);
            //ここでオブジェクトがとれている(略)

         }
}

해설



제대로 이해하지는 않기 때문에 동물 감각으로 설명
  • 입력 한 사용자 + 암호에서 토큰 얻기
  • 토큰에서 AWS 계정 얻기
  • AWS 계정에서 다양한 API 사용

  • 1. 입력한 ID/비밀번호로부터 토큰을 얻는다



    공식: Amazon CognitoAuthentication 확장 라이브러리의 예에 쓰여진 것
            AmazonCognitoIdentityProviderClient provider = new AmazonCognitoIdentityProviderClient(new Amazon.Runtime.AnonymousAWSCredentials(), wwRegion);
            CognitoUserPool userPool = new CognitoUserPool(wwUserPoolID, wwAppClientID, provider);
            CognitoUser user = new CognitoUser(txtID.Text, wwAppClientID, userPool, provider);
            InitiateSrpAuthRequest authRequest = new InitiateSrpAuthRequest()
            {
                Password = txtPass.Text
            };
    
            AuthFlowResponse authResponse = await user.StartWithSrpAuthAsync(authRequest).ConfigureAwait(false);
            string idToken = authResponse.AuthenticationResult.IdToken;
    

    토큰은 액세스 토큰, ID 토큰 및 기타가있는 모습 (자세한 내용은 여기)

    ID 및 비밀번호가 Cognito로 등록된 사용자에게 해당하면 idToken에 긴 문자열이 설정됩니다.

    2. 토큰을 사용하여 AWS 권한 부여 얻기



    페더레이티드 아이덴티티 샘플 코드 → AWS 자격 증명 얻기 소스 코드 사용

            CognitoAWSCredentials credentials = new CognitoAWSCredentials(
                wwIdPoolID, // ID プールの ID
                wwRegion    // リージョン
            );
    

    credential 객체에 위에서 얻은 ID 토큰을 전달합니다.
            credentials.AddLogin("cognito-idp.us-east-1.amazonaws.com/" + wwUserPoolID, idToken);
            //↓おまじない
            string hoge = await credentials.GetIdentityIdAsync();
    

    확실하지 않지만 속이지 않습니다.

    여기에서 얻을 수 있는 AWS 계정은 👇 이것입니다.


    3.다음은, 통상의 인증과 같이 사용할 수 있다


            using (var client = new AmazonS3Client(credentials, wwRegion))
            {
                var S3Request = new ListObjectsRequest();
               S3Request.BucketName = wwS3BucketName;
                var S3Response = await client.ListObjectsAsync(S3Request);
                //ここでオブジェクトがとれている(略)
    
             }
    

    요약



    .Net계는 좀처럼 정보를 찾을 수 없다. .
    수시로 수정합니다. .

    좋은 웹페이지 즐겨찾기