AWS Cognito에서 MFA=OPTIONAL로 설정하고 각 사용자에 대해 활성화

9122 단어 MFAcognitoAWS
제목대로입니다.

평상시는 node(typescript)라든지로 어플리케이션의 구축(API서버)하고 있습니다.
cognito에서 사용자별로 MFA를 활성화하려고 하면 어떻게 해야 하는지 검증한 비망록을 아래에 기재합니다.

전제


  • cognito userPool는 만들고 있다
  • 이메일로 로그인 허용
  • 클라이언트도 작성하고 있다

  • 활성화하려면 TOTP에서 MFA
  • 검증 레벨이므로 awsCli 사용
  • config가 이미 설정되어 있습니다.


  • MFA = required는 userPool을 만들 때만 설정할 수 있습니다.



    문서는 다음

    필수가 아닌 경우 변경 가능



    off <-> optional 은 가능.

    스크린샷 거리.
    cognito > MFA and verifications에서 설정 가능.

    optional로 하고 TOTP에 체크를 둔다.





    signup 및 confirm


    $ aws cognito-idp sign-up --client-id [clientId] --username [email] --password [password]
    {
        "UserConfirmed": false,
        "CodeDeliveryDetails": {
            "Destination": "[一部マスクされたemail]",
            "DeliveryMedium": "EMAIL",
            "AttributeName": "email"
        },
        "UserSub": "[userSub]"
    }
    
    $ aws cognito-idp confirm-sign-up --client-id [clientId] --username [email] --confirmation-code [メールで送られてきたconfirmationCode]
    

    우선 로그인해 보자.


    MFA = off 때와 같은 응답
    $ aws cognito-idp admin-initiate-auth --user-pool-id [userPoolId] --client-id [clientId] --auth-flow ADMIN_NO_SRP_AUTH --auth-parameters USERNAME=[email],PASSWORD=[password]
    {
        "ChallengeParameters": {},
        "AuthenticationResult": {
            "AccessToken": "[accessToken]",
            "ExpiresIn": 3600,
            "TokenType": "Bearer",
            "RefreshToken": "[refreshToken]",
            "IdToken": "[idToken]"
        }
    }
    

    MFA 활성화


    $ aws cognito-idp associate-software-token --access-token [accessToken]
    {
        "SecretCode": "[secretCode]"
    }
    

    googleAuthenticator 등에서이 코드를 등록하거나이 코드에서 QR 코드를 생성하여 읽습니다.

    토큰 확인


    $ aws cognito-idp verify-software-token --access-token [accessToken] --user-code [googleAuthenticator等で発行されてるトークン]
    {
        "Status": "SUCCESS"
    }
    

    사용자에게 MFA 설정 설정



    TOTP를 활성화하고 선호하는 설정
    (우선도 아무것도 이 userPool에는 TOTP 밖에 허가하지 않지만)
    $ aws cognito-idp admin-set-user-mfa-preference --username [userName] --user-pool-id [userPoolId] --software-token-mfa-settings Enabled=true,PreferredMfa=true
    

    설정 완료 후 로그인해 봅니다.



    아까 정도의 로그인과는 응답이 다르다.ログインに挑戦しましょう。成功したらaccessToken渡すよ 적인 상태가 되고 있다.
    그래서 MFA의 토큰 검증도 통과하면 accessToken이 반환된다.
    USER_ID_FOR_SRPUSER_ID_FOR_SRP === userName === sub 이므로, uuid적인 것이 표시되고 있다.
    $ aws cognito-idp admin-initiate-auth --user-pool-id [userPoolId] --client-id [clientId] --auth-flow ADMIN_NO_SRP_AUTH --auth-parameters USERNAME=[email],PASSWORD=[password]
    {
        "ChallengeName": "SOFTWARE_TOKEN_MFA",
        "Session": "[session]",
        "ChallengeParameters": {
            "USER_ID_FOR_SRP": "[uuid的なやつ]"
        }
    }
    

    로그인 시 토큰 확인



    session이나 challengeName 등, admin-initiate-auth 의 응답을 사용한다.
    $ aws cognito-idp admin-respond-to-auth-challenge --user-pool-id [userPoolId] --client-id [clientId] --challenge-name SOFTWARE_TOKEN_MFA --session [session] --challenge-responses USERNAME=[admin-initiate-authのレスポンスのUSER_ID_FOR_SRP],SOFTWARE_TOKEN_MFA_CODE=[googleAuthenticator等で発行されてるトークン]
    {
        "ChallengeParameters": {},
        "AuthenticationResult": {
            "AccessToken": "[accessToken]",
            "ExpiresIn": 3600,
            "TokenType": "Bearer",
            "RefreshToken": "[refreshToken]",
            "IdToken": "[idToken]"
        }
    }
    

    문서 봐도 --challenge-responses 의 파라미터의 기재 찾아내지 못하고 당황했다.
    오류 뱉어 부족한 파라미터 확인을 반복했다.

    각 챌린지에 대응한 --challenge-responses 의 파라미터의 기재가 망라되고 있는 것이 있으면 가르쳐 주실 수 있습니까?



    그건 그렇고



    associate 전에 set 하려고 하면 아래와 같이 화내므로, cognitoAPI의 실행 순서에 주의입니다.
    associate-software-token => admin-set-user-mfa-preference 의 순서로!
    An error occurred (InvalidParameterException) when calling the AdminSetUserMFAPreference operation: User has not set up software token mfa
    

    typescript의 경우



    내가 실제로 API에 통합할 때는 이것을 ts로 사용할 필요가 있다.
    js의 awsSdk라면 아래가 비슷한 cognitoAPI (라고 생각한다)
    new CognitoIdentityServiceProvider().adminInitiateAuth();
    new CognitoIdentityServiceProvider().associateSoftwareToken();
    new CognitoIdentityServiceProvider().adminSetUserMFAPreference();
    new CognitoIdentityServiceProvider().verifySoftwareToken();
    new CognitoIdentityServiceProvider().adminRespondToAuthChallenge();
    

    좋은 웹페이지 즐겨찾기