株式会社ヴァンデミックシステム

Blog

<スポンサーリンク>

GlobalSignOutはそのユーザーに紐づく全てのトークンを無効。
RevokeTokenは指定したリフレッシュトークンに連なるトークンを無効。

動作を見てみる。

ユーザーパスワードでCognitoで認証し、トークンを取得する。

USER_POOL_ID=ap-northeast-1_xxxxxxxx
CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxx
USER_EMAIL="adminuser-0@test.com"
PASSWORD="Password01"

aws cognito-idp admin-initiate-auth \
  --user-pool-id ${USER_POOL_ID} \
  --client-id ${CLIENT_ID} \
  --auth-flow ADMIN_NO_SRP_AUTH \
  --auth-parameters "USERNAME=${USER_EMAIL},PASSWORD=${PASSWORD}"

RefreshToken、IdToken、AccessTokenが返る。

{
    "ChallengeParameters": {},
    "AuthenticationResult": {
        "AccessToken": "xxx",
        "ExpiresIn": 300,
        "TokenType": "Bearer",
        "RefreshToken": "xxx",
        "IdToken": "xxx"
    }
}

RefreshTokenのみを取得して環境変数に入れる。

REFRESH_TOKEN=$(aws cognito-idp admin-initiate-auth \
  --user-pool-id ${USER_POOL_ID} \
  --client-id ${CLIENT_ID} \
  --auth-flow ADMIN_NO_SRP_AUTH \
  --auth-parameters "USERNAME=${USER_EMAIL},PASSWORD=${PASSWORD}" \
  --query "AuthenticationResult.RefreshToken" \
  --output text)

RefreshTokenを使ってトークンを再発行する。

aws cognito-idp admin-initiate-auth \
  --user-pool-id ${COGNITO_USERPOOL_ID} \
  --client-id ${COGNITO_CLIENT_ID} \
  --auth-flow REFRESH_TOKEN_AUTH \
  --auth-parameters "REFRESH_TOKEN=${REFRESH_TOKEN}" \
  --no-cli-pager

IdTokenとRefreshTokenが再発行される。
RefreshTokenを使っているので、RefreshTokenは再発行はされない。

{
    "ChallengeParameters": {},
    "AuthenticationResult": {
        "AccessToken": "yyy",
        "ExpiresIn": 300,
        "TokenType": "Bearer",
        "IdToken": "yyy"
    }
}

RevokeTokenを使って指定したRefreshTokenを失効させる。

あらかじめ、2種類のRefreshTokenを発行しておく。

➜  app git:(dev) ✗ REFRESH_TOKEN=$(aws cognito-idp admin-initiate-auth \
  --user-pool-id ${USER_POOL_ID} \
  --client-id ${CLIENT_ID} \
  --auth-flow ADMIN_NO_SRP_AUTH \
  --auth-parameters "USERNAME=${USER_EMAIL},PASSWORD=${PASSWORD}" \
  --query "AuthenticationResult.RefreshToken" \
  --output text)
➜  app git:(dev) ✗ AAA_REFRESH_TOKEN=$(aws cognito-idp admin-initiate-auth \
  --user-pool-id ${USER_POOL_ID} \
  --client-id ${CLIENT_ID} \
  --auth-flow ADMIN_NO_SRP_AUTH \
  --auth-parameters "USERNAME=${USER_EMAIL},PASSWORD=${PASSWORD}" \
  --query "AuthenticationResult.RefreshToken" \
  --output text)

片方のみを失効させる。

aws cognito-idp revoke-token \
  --client-id ${CLIENT_ID} \
  --token ${REFRESH_TOKEN}

${REFRESH_TOKEN}を使ったトークン再取得は失敗するが、${AAA_REFRESH_TOKEN}は成功している。

➜  app git:(dev) ✗ aws cognito-idp admin-initiate-auth \
  --user-pool-id ${COGNITO_USERPOOL_ID} \
  --client-id ${COGNITO_CLIENT_ID} \
  --auth-flow REFRESH_TOKEN_AUTH \
  --auth-parameters "REFRESH_TOKEN=${REFRESH_TOKEN}" \
  --no-cli-pager

An error occurred (NotAuthorizedException) when calling the AdminInitiateAuth operation: Refresh Token has been revoked
➜  app git:(dev) ✗
➜  app git:(dev) ✗ aws cognito-idp admin-initiate-auth \
  --user-pool-id ${COGNITO_USERPOOL_ID} \
  --client-id ${COGNITO_CLIENT_ID} \
  --auth-flow REFRESH_TOKEN_AUTH \
  --auth-parameters "REFRESH_TOKEN=${AAA_REFRESH_TOKEN}" \
  --no-cli-pager
{
    "ChallengeParameters": {},
    "AuthenticationResult": {
        "AccessToken": "yyy",
        "ExpiresIn": 300,
        "TokenType": "Bearer",
        "IdToken": "yyy"
    }
}
➜  app git:(dev) ✗

詰まるところ、指定したRefreshTokenのみを失効させることができた。

GlobalSignOutはどうだろう。

同様に、あらかじめ、2種類のRefreshTokenを発行しておく。

➜  app git:(dev) ✗ REFRESH_TOKEN=$(aws cognito-idp admin-initiate-auth \
  --user-pool-id ${USER_POOL_ID} \
  --client-id ${CLIENT_ID} \
  --auth-flow ADMIN_NO_SRP_AUTH \
  --auth-parameters "USERNAME=${USER_EMAIL},PASSWORD=${PASSWORD}" \
  --query "AuthenticationResult.RefreshToken" \
  --output text)
➜  app git:(dev) ✗ AAA_REFRESH_TOKEN=$(aws cognito-idp admin-initiate-auth \
  --user-pool-id ${USER_POOL_ID} \
  --client-id ${CLIENT_ID} \
  --auth-flow ADMIN_NO_SRP_AUTH \
  --auth-parameters "USERNAME=${USER_EMAIL},PASSWORD=${PASSWORD}" \
  --query "AuthenticationResult.RefreshToken" \
  --output text)

トークンを失効させる。

aws cognito-idp admin-user-global-sign-out \
  --user-pool-id ${USER_POOL_ID} \
  --username ${USER_EMAIL}

両方のRefreshTokenが失効した。

➜  app git:(dev) ✗ aws cognito-idp admin-initiate-auth \
  --user-pool-id ${COGNITO_USERPOOL_ID} \
  --client-id ${COGNITO_CLIENT_ID} \
  --auth-flow REFRESH_TOKEN_AUTH \
  --auth-parameters "REFRESH_TOKEN=${REFRESH_TOKEN}" \
  --no-cli-pager

An error occurred (NotAuthorizedException) when calling the AdminInitiateAuth operation: Refresh Token has been revoked
➜  app git:(dev) ✗
➜  app git:(dev) ✗
➜  app git:(dev) ✗ aws cognito-idp admin-initiate-auth \
  --user-pool-id ${COGNITO_USERPOOL_ID} \
  --client-id ${COGNITO_CLIENT_ID} \
  --auth-flow REFRESH_TOKEN_AUTH \
  --auth-parameters "REFRESH_TOKEN=${AAA_REFRESH_TOKEN}" \
  --no-cli-pager

An error occurred (InvalidParameterException) when calling the AdminInitiateAuth operation: Missing required parameter REFRESH_TOKEN
➜  app git:(dev) ✗

そうなんだろうなと思いつつ、やってみると理解が深まる。

参考
https://dev.classmethod.jp/articles/amazon-cognito-now-supports-targeted-sign-out-through-refresh-token-revocation/

<スポンサーリンク>

コメントを残す

Allowed tags:  you may use these HTML tags and attributes: <a href="">, <strong>, <em>, <h1>, <h2>, <h3>
Please note:  all comments go through moderation.

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)