【Cognito】API GlobalSignOutとRevokeTokenの違い
![](https://vamdemicsystem.black/wp-content/uploads/2019/10/13.jpg)
GlobalSignOutはそのユーザーに紐づく全てのトークンを無効。
RevokeTokenは指定したリフレッシュトークンに連なるトークンを無効。
動作を見てみる。
ユーザーパスワードでCognitoで認証し、トークンを取得する。
1 2 3 4 5 6 7 8 9 10 |
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が返る。
1 2 3 4 5 6 7 8 9 10 |
{ "ChallengeParameters": {}, "AuthenticationResult": { "AccessToken": "xxx", "ExpiresIn": 300, "TokenType": "Bearer", "RefreshToken": "xxx", "IdToken": "xxx" } } |
RefreshTokenのみを取得して環境変数に入れる。
1 2 3 4 5 6 7 |
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を使ってトークンを再発行する。
1 2 3 4 5 6 |
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は再発行はされない。
1 2 3 4 5 6 7 8 9 |
{ "ChallengeParameters": {}, "AuthenticationResult": { "AccessToken": "yyy", "ExpiresIn": 300, "TokenType": "Bearer", "IdToken": "yyy" } } |
RevokeTokenを使って指定したRefreshTokenを失効させる。
あらかじめ、2種類のRefreshTokenを発行しておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
➜ 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) |
片方のみを失効させる。
1 2 3 |
aws cognito-idp revoke-token \ --client-id ${CLIENT_ID} \ --token ${REFRESH_TOKEN} |
${REFRESH_TOKEN}を使ったトークン再取得は失敗するが、${AAA_REFRESH_TOKEN}は成功している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
➜ 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を発行しておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
➜ 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) |
トークンを失効させる。
1 2 3 |
aws cognito-idp admin-user-global-sign-out \ --user-pool-id ${USER_POOL_ID} \ --username ${USER_EMAIL} |
両方のRefreshTokenが失効した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
➜ 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/