12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS Cognito の特徴とやってみる

Posted at

1.特徴#

アプリからできるだけログアウトさせたくない。
普段使い慣れているFacebook,Google,Amazonなどと連携させて利用したい。

などといっった課題が出てきます。

AWS Cognitoは、

  • 複雑なインフラ基盤構築なしに認証、認可の機能を実装可能。
  • 複数の認証方式やID情報を一元管理可能。
  • 業界標準認証連携プロトコルに対応、Facebook,Google,Amazon,Microsoft ActiveDirectoryなどと容易に連携可能。
  • 利用者の増加やサインアップ、サインイン回数の増加に対応してインフラを自動的にスケールさせる。

マネージドサービスです。

2.認証と認可#

【認証】アクセスしてきたユーザが本人であることを確認する。
 ↓
【認可】 アクセスしようとしているリソースに権限があるかを確認する。
 ↓
【【データアクセス】】

3.ユーザープールとIDプール#

スクリーンショット 2019-10-13 18.10.00.png

ユーザープールはアプリの開発者の方のためのサービス、
IDプールはAWSのサービスと連携するためのサービス。

4.MFAのサポート#

  • SMSテキストメッセージ
  • ソフトウェアトークン

5.Amazon Cognito Advanced Security機能#

簡単な設定で利用者のID詐称を検知、防御するコントロールを検知。

  • アダプティブ認証
  • ユーザーおよび使用しているデバイス単位でリスクコアを計算し、ID詐称が行われているか検証する。
  • 漏洩した認証情報(ID/passwordの組み合わせ)の利用の検知
  • Amazonで収集している漏洩した認証情報とのマッチングを行い検知する。

検知した場合は、ロギング、アクセスをブロック、追加の認証(MFA)の実行などを要求するように実装することもできます。

6.他アプリケーションとの連携#

スクリーンショット 2019-10-13 18.46.06.png

7.やってみた#

7-1 静的ウェブホスティング##

・S3バケットに必要なコンテンツを同期し、アップロードされたことだけ確認しておきます。

aws s3 sync s3://wildrydes-us-east-1/WebApplication/1_StaticWebHosting/website s3://<<YOUR_BUCKET_NAME>>

aws s3 ls s3://<<YOUR_BUCKET_NAME>>
                           PRE css/
                           PRE fonts/
                           PRE images/
                           PRE js/
2019-10-17 05:41:34       2992 apply.html
2019-10-17 05:41:34       6540 faq.html
2019-10-17 05:41:34       1406 favicon.ico
2019-10-17 05:41:41       6757 index.html
2019-10-17 05:41:41       6079 investors.html
2019-10-17 05:41:42       2735 register.html
2019-10-17 05:41:42       4329 ride.html
2019-10-17 05:41:42         43 robots.txt
2019-10-17 05:41:42       2590 signin.html
2019-10-17 05:41:43       5047 unicorns.html
2019-10-17 05:41:43       2595 verify.html

・ウェブホスティングを有効にする。

aws s3 website s3://my-bucket/ --index-document index.html

・パブリック読み込みを許可するバケットポリシーを作成します。

policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::naata-s3/*"
        }
    ]
}

aws s3api put-bucket-policy --bucket naata-s3 --policy file://policy.json

・S3 バケットのウェブサイトエンドポイント URL にアクセスし表示だけ確認しておく。

7-2 ユーザー管理##

・Cognito ユーザープールを作成(設定はデフォルトのまま)し、[プール ID] を確認しておく。
image.png

・ユーザープールにアクセスするための固有の ID とオプションのシークレットキーが付与するためにアプリクライアントを作成し、次の画面で[アプリクライアントID]を控えておく。「クライアントシークレットを生成する」のチェックは外しておく。
image.png
image.png

・config.jsファイルの「userPoolId」「userPoolClientId」「region」を編集し更新する。

aws s3 cp s3://<<YOUR_BUCKET_NAME>>/js/config.js config.js

config.js
window._config = {
    cognito: {
        userPoolId: '', // e.g. us-east-2_uXboG5pAb
        userPoolClientId: '', // e.g. 25ddkmj4v6hfsfvruhpfi7n4hv
        region: '' // e.g. us-east-2
    },
    api: {
        invokeUrl: '' // e.g. https://rc7nyt4tql.execute-api.us-west-2.amazonaws.com/prod',
    }
}

aws s3 cp config.js s3://<<YOUR_BUCKET_NAME>>/js/config.js/

aws s3 ls s3://naata-s3/js/
                           PRE vendor/
2019-10-17 05:41:41       5198 cognito-auth.js
2019-10-17 07:21:28        370 config.js
2019-10-17 05:41:41       3845 esri-map.js
2019-10-17 05:41:41        168 main.js
2019-10-17 05:41:41       3642 ride.js
2019-10-17 05:41:41      86826 vendor.js

・register.htmlにアクセスし2 つの方法で検証していきます。

1.自分のメールアドレス
電子メールで受け取った認証コードを入力して、アカウントの検証プロセスを完了できます。

2.ダミーのメールアドレス
ダミーの E メールアドレスを使用した場合は、Cognito コンソールから手動でユーザーを確認する必要があります。​

1で登録した場合は、[E メール確認済み]が「true」2で確認した場合は「false」。
image.png

2は[ユーザーの確認]でプロセスを終了させることができます。
image.png

・signin.htmlにアクセス、ログインできるか確認しておきます。

7-3 サーバーレスサービスバックエンド##

・DynamoDBテーブルを以下のとおり作成する。
image.png

・Lambda関数のIAMロールを作成する。アタッチするのは管理ポリシーとインラインポリシー。

AWSLambdaBasicExecutionRole
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}
naata-dynamodb
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "dynamodb:PutItem",
            "Resource": "<Amazon リソースネーム(ARN)>"
        }
    ]
}

・リクエストを処理するためのLambda関数を作成する。node.jsで作成し、先程作成したIAMロールを指定する。関数は以下のとおり。
https://github.com/aws-samples/aws-serverless-workshops/blob/master/WebApplication/3_ServerlessBackend/requestUnicorn.js

以下のテストイベントを実行する。

{
    "path": "/ride",
    "httpMethod": "POST",
    "headers": {
        "Accept": "*/*",
        "Authorization": "eyJraWQiOiJLTzRVMWZs",
        "content-type": "application/json; charset=UTF-8"
    },
    "queryStringParameters": null,
    "pathParameters": null,
    "requestContext": {
        "authorizer": {
            "claims": {
                "cognito:username": "the_username"
            }
        }
    },
    "body": "{\"PickupLocation\":{\"Latitude\":47.6174755835663,\"Longitude\":-122.28837066650185}}"
}

結果は以下のとおり。

{
  "statusCode": 201,
  "body": "{\"RideId\":\"YlhfLuMeqw57vU-yF8UaXQ\",\"Unicorn\":{\"Name\":\"Shadowfax\",\"Color\":\"White\",\"Gender\":\"Male\"},\"UnicornName\":\"Shadowfax\",\"Eta\":\"30 seconds\",\"Rider\":\"the_username\"}",
  "headers": {
    "Access-Control-Allow-Origin": "*"
  }

・DynamoDBにも以下のとおり作成されていることがわかる。
image.png

7-4 RESTful API##

・APIを作成する。[エンドポイント]は「エッジ最適化」とする。
image.png

・オーソライザーで、Cognito ユーザープールを使用して API へのアクセスを制御できるようにします。
image.png

・ride.htmlにアクセスし、認証トークンを張り付けてテストします。
image.png

・レスポンスが返ってきたことがわかります。
Response Code(応答コード): 200

・APIに[リソース]を「ride」と[メゾット]を「POST」で作成、作成したLambda関数を指定する。
image.png

・[メソッドリクエスト]でCognito ユーザープールオーソライザーを選択します。
image.png

・デプロイし、 [URL の呼び出し]をconfig.jsのinvokeUrlに記載する。

config.js
window._config = {
    cognito: {
        userPoolId: '', // e.g. us-east-2_uXboG5pAb
        userPoolClientId: '', // e.g. 25ddkmj4v6hfsfvruhpfi7n4hv
        region: '' // e.g. us-east-2
    },
    api: {
        invokeUrl: '' // e.g. https://rc7nyt4tql.execute-api.us-west-2.amazonaws.com/prod',
    }
}

・動作確認をし以上で完了。

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?