Skip to content

ot-nemoto/APIGatewayAuthNDemo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 

Repository files navigation

APIGatewayAuthNDemo

概要

  • API GatewayのリクエストにCognitoによる認証を組み込んだデモ

構成

構成

  • APIを叩く前に、CognitoからTokenを取得する(このデモでは取得する箇所は aws-cli を使用し、実装してはいない)
  • APIへはCognitoから取得したTokenをヘッダーに付与し、リクエストを投げる
  • API GatewayはヘッダーのTokenでCognitoへ認証を行う
  • 認証が通った場合、API GatewayはLambdaを起動する(Lambdaでは、EC2のインスタンスID一覧を取得する)

前提条件

  • aws-cli で構築するため、aws configure の設定は適宜実施していること
  • templateではAPI Gatewayのログを出力するようにCloudFormationに定義しています。該当RegionのAPI GatewayでAPI GateawyのRoleの設定が必要です。

デプロイ

aws cloudformation create-stack \
    --stack-name api-gateway-authn-demo \
    --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_IAM \
    --template-body file://template.yaml

使い方

ユーザ作成

ユーザプールIDを取得

USER_POOL_ID=$(aws cloudformation describe-stacks \
    --stack-name api-gateway-authn-demo \
    --query 'Stacks[].Outputs[?OutputKey==`UserPoolId`].OutputValue' \
    --output text)
echo ${USER_POOL_ID}
  # ap-northeast-1_ydrdhvOdG

ユーザ名は ot-nemoto@example.com / 初期パスワードは Passw0rd?

USERNAME=ot-nemoto@example.com
PASSWORD=Passw0rd?

aws cognito-idp admin-create-user \
    --user-pool-id ${USER_POOL_ID} \
     --username ${USERNAME} \
    --temporary-password ${PASSWORD}

初回認証

ユーザプールのクライアントIDを取得

USER_POOL_CLIENT_ID=$(aws cloudformation describe-stacks \
    --stack-name api-gateway-authn-demo \
    --query 'Stacks[].Outputs[?OutputKey==`UserPoolClientId`].OutputValue' \
    --output text)
echo ${USER_POOL_CLIENT_ID}
  # 4rt9kn7rd5c7av4686tec5p21k

認証

aws cognito-idp initiate-auth \
     --auth-flow USER_PASSWORD_AUTH \
     --client-id ${USER_POOL_CLIENT_ID} \
     --auth-parameters USERNAME=${USERNAME},PASSWORD=${PASSWORD}
  # {
  #     "ChallengeName": "NEW_PASSWORD_REQUIRED",
  #     "ChallengeParameters": {
  #         "USER_ID_FOR_SRP": "d0b2ec76-ac3b-47b8-ad14-3aa7fac7c102",
  #         "requiredAttributes": "[]",
  #         "userAttributes": "{\"email\":\"ot-nemoto@example.com\"}"
  #     },
  #     "Session": "1a2lI3uS03...JzBV0cyng4"
  # }

パスワード変更

ユーザ作成時には、ユーザのステータスが FORCE_CHANGE_PASSWORD であるため、APIの認証に使うためのトークンIDを取得できない Sessionを利用し、初期パスワードを更新する

Sessionを取得

SESSION=$(aws cognito-idp initiate-auth \
     --auth-flow USER_PASSWORD_AUTH \
     --client-id ${USER_POOL_CLIENT_ID} \
     --auth-parameters USERNAME=${USERNAME},PASSWORD=${PASSWORD} \
     --query 'Session' --output text)
echo ${SESSION}
  # 1a2lI3uS03...JzBV0cyng4

パスワードを qwerT1234% に変更

NEW_PASSWORD=qwerT1234%

aws cognito-idp respond-to-auth-challenge \
    --client-id ${USER_POOL_CLIENT_ID} \
    --challenge-name NEW_PASSWORD_REQUIRED \
    --challenge-responses USERNAME=${USERNAME},NEW_PASSWORD=${NEW_PASSWORD} \
    --session "${SESSION}"
  # {
  #     "AuthenticationResult": {
  #         "ExpiresIn": 3600,
  #         "IdToken": "eyJraWQiOi...QJuwtGQ_dQ",
  #         "RefreshToken": "eyJjdHkiOi...4fhSK18PfA",
  #         "TokenType": "Bearer",
  #         "AccessToken": "eyJraWQiOi...5u3c0Xibsg"
  #     },
  #     "ChallengeParameters": {}
  # }

APIを実行

認証機能を有効にしたAPIのエンドポイントを取得

INVOKE_URL=$(aws cloudformation describe-stacks \
    --stack-name api-gateway-authn-demo \
    --query 'Stacks[].Outputs[?OutputKey==`InvokeURL`].OutputValue' \
    --output text)
echo ${INVOKE_URL}
  # https://a76l5zr17l.execute-api.ap-northeast-1.amazonaws.com/v1/

トークンID未設定でAPIを実行

curl -s -XGET ${INVOKE_URL} | jq
  # {
  #   "message": "Unauthorized"
  # }

トークンIDを取得

TOKEN=$(aws cognito-idp initiate-auth \
     --auth-flow USER_PASSWORD_AUTH \
     --client-id ${USER_POOL_CLIENT_ID} \
     --auth-parameters USERNAME=${USERNAME},PASSWORD=${NEW_PASSWORD} \
     --query 'AuthenticationResult.IdToken' \
     --output text)
echo ${TOKEN}
  # eyJraWQiOi...lJcHl_o_kg

トークンIDをリクエストヘッダーに付与しAPIを実行

curl -s -XGET ${INVOKE_URL} -H "Authentication:${TOKEN}" | jq
  # {
  #   "instanceIds": [
  #     "i-01234567",
  #     "i-89012345"
  #   ]
  # }

ポイント

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published