AWS Amplifyを使ってAmazon Cognitoを体験してみる
メインはAmazon Cognitoの理解です。
Amazon Cognitoまわりの作成は簡単にできるのですが、挙動を確認するにはUIがあるほうが理解が進むと思ったので、AWS Amplifyを使って体験してみました。
せっかくだったのでローカルで動かすだけではなく、S3にデプロイして動かしてみたのでメモしておきます。東京リージョンで作業しています。
Amazon Cognitoとは
まずはBlackBeltを読むと良いと思います。
続いてコンソールからアクセスすると以下の説明が出てきます。
Amazon Cognito は、ユーザーのアプリへのサインアップとサインイン、ソーシャル ID プロバイダーからの ID のフェデレーション、AWS のリソースへのセキュアなアクセス、および複数のデバイス、プラットフォーム、アプリケーションにわたるデータの同期を簡単にします。
Amazon Cognitoは「User Pools」と「Federated Identities」に分かれるので、それぞれ個人的な理解を簡潔にメモしておきます。
概要は理解はできたけど、簡潔に説明するとなると難しい。。
※「Cognito Sync」は今回触っていないので説明していません。
User Pools
- マネージドなユーザ管理サービスです。
- サインアップ、サインイン、サインアウトなどの認証を担当しています。
- FacebookやGoogleのような外部認証プロバイダと同列で、独自の認証プロバイダとして動作します。
認証機能だけであればUser Poolsだけでも動作可能です。
Federated Identities
- エンドユーザに一意のIDを割り振るためのサービスです。
- 認証プロバイダに認証されたエンドユーザに対して、AWSリソースへのアクセスを許可することができ認可を担当しています。
- 認可OKの場合はIAM側でSTSから一時アクセスキーが発行されます。
- FacebookやGoogleのような外部認証プロバイダやUser Poolsで認証されたエンドユーザを同一IDとして一元管理できます。
AWSリソースへアクセスするためにはFederated Identitiesが必要です。
User Poolsと統合することで外部認証プロバイダを使用することなくAWSリソースへアクセスすることが可能になります。
Amazon Cognitoをコンソールから構築してみる
実際に構築することで理解を深めていきます。
以下の記事を参考に構築しました。
dev.classmethod.jp
User Pools
Amazon Cognitoの「ユーザプールの管理」からアクセスします。
ユーザープールを作成する
「ユーザープールを作成する」→プール名を埋める→「デフォルトを確認する」→「プールの作成」と進みます。
プールID(ap-northeast-1_XXXXXXXXX)が表示されるのでメモしておきましょう。
アプリクライアントの追加
「アプリクライアント」→「アプリクライアントの追加」→アプリクライアント名を埋めて、「クライアントシークレットを生成」のチェックを外す→「アプリクライアントの作成」と進みます。
アプリクライアントID(XXXXXXXXXXXXXXXXXXXXXXXXX)が表示されるのでメモしておきます。
ユーザーの作成
「全体設定」→「ユーザーとグループ」→「ユーザの作成」→ユーザ名、仮パスワード、Eメールを埋める→「ユーザーの作成」と進みます
ステータスを見ると「FORCE_CHANGE_PASSWORD」と表示されています。
作成と同時に仮パスワードが書かれた以下のメールが飛んできます。
件名 Your temporary password 宛先 no-reply@verificationemail.com
UIがないと動作確認が難しいのでいったんここまで。
Federated Identities
Amazon Cognitoの「フェデレーテッドアイデンティティの管理」からアクセスします。
User Poolsと連携したIDプールを作成する
「新しいIDプールの作成」→IDプール名を埋める→(今回は「認証されていない ID に対してアクセスを有効にする」のチェックはどちらでもよい)→「認証プロバイダー」→さきほどメモした「プールID」と「アプリクライアントID」を埋める→「プールの作成」と進みます。
ID プールの ID(ap-northeast-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) が表示されるのでメモしておきます。
UIがないと動作確認が難しいのでいったんここまで。
AWS Amplifyを使ってAmazon Cognito体験
以下の記事を参考に構築しました。
dev.classmethod.jp
nodejsのインストール、identityPoolIdの記載、S3へのデプロイ以外はほとんど参考リンク先の記述とほぼ同じになってしまいました。。
AWS Amplifyとは
AWS Amplifyは、2017年11月に公開されたAWSを利用するWebアプリケーション向けのJavaScriptライブラリです。サインアップやサインイン、MFA、追跡またはメトリクスの分析、コンテンツ管理、またはサーバーレスAPI統合などの実装が容易にできるように設計されています。
事前準備
適当にAmazon Linuxインスタンスを起動して試しました。
node jsをインストール
以下のリンクから最新版を確認。
Download | Node.js
$ wget https://nodejs.org/dist/v8.9.4/node-v8.9.4-linux-x64.tar.xz $ xz -dv node-v8.9.4-linux-x64.tar.xz $ tar xfv node-v8.9.4-linux-x64.tar $ ln -s node-v8.9.4-linux-x64 node (.profileを作成) $ cat .profile export NODE_HOME=$HOME/node export NODE_PATH=$NODE_HOME/lib/node_modules export PATH=$NODE_HOME/bin:$PATH $ source .profile $ node --version v8.9.4 $ npm --version 5.6.0
yarnをインストール
$ npm install -g yarn
Reactひな形を作成
(参考リンク先コマンドのyarn global add create-react-app だとcreate-react-appが動かなかったのでnpmで実行)
$ npm install -g create-react-app $ create-react-app amplify-react-sample $ cd amplify-react-sample
Webアプリケーションの実装
まずは、AmplifyライブラリとAmplifyのReact拡張ライブラリのインストールを行います。
$ yarn add aws-amplify aws-amplify-react
src/App.jsの書き換え
続いてsrc/App.jsを以下に書き換えます。
import React, { Component } from 'react'; import Amplify from 'aws-amplify'; import { Authenticator } from 'aws-amplify-react'; Amplify.configure({ Auth: { region: 'ap-northeast-1', // REQUIRED - Amazon Cognito Region userPoolId: 'ap-northeast-1_XXXXXXXXX', //OPTIONAL - Amazon Cognito User Pool ID userPoolWebClientId: 'XXXXXXXXXXXXXXXX', //OPTIONAL - Amazon Cognito Web Client ID identityPoolId: 'ap-northeast-1:XXXXXXXXXXXXXXXXXXXXXXXXXXX', // FederatedID連携後に追加する } }); class AppWithAuth extends Component { render() { return <Authenticator /> } }
参考リンク先のコードにidentityPoolIdの行を追加した形になります。
詳細なシーケンスは意識せずに、裏で紐づけをやってくれるのが非常に便利だと感じました。
各種IDには以下の値を埋めます。
- userPoolID
- プール作成時に作られたプールID
- userPoolWebClientId
- アプリクライアント作成時に作られたアプリクライアントID
- identityPoolId
- フェデレーティッドアイデンティティでIDプール作成時に作られたIDプールのID
S3にデプロイ
パブリックアクセス許可
アクセスコントロールリストから、読み取りのパブリックアクセスを許可をします。
Static website hostingを有効化
「Static website hosting」を有効化して、エンドポイントをメモしておきます。