こんにちは、技術4課OJT中の峯です。
最近、さまざまなWEBアプリ・モバイルアプリが登場していますね。
私もニュースアプリや家計簿アプリ、フリマアプリなどはよく利用しています。
名前や住所などのような個人情報を扱うアプリケーションや、有料か無料かによってサービス内容が変わるアプリケーションは、利用者はユーザー登録・認証、もしくはFacebookやTwitterなどのアカウントでのログインをし、アプリ側で個人が認識されなくてはなりません。
Amazon Cognitoとは???
しかし、WEBアプリやモバイルアプリを開発するときにユーザー認証の実装は開発者にとって簡単ではありません。
またFacebookやTwitterなどのソーシャルIDプロバイダーを利用しログイン可能にしようとするとなおさらです。
それらの問題を解決するのがAmazon Cognitoです。
Amazon Cognitoは3つの機能に分けられます。
- Amazon Cognito ユーザープール
- Amazon Cognito フェデレーテッドアイデンティティ
- Amazon Cognito Sync
Amazon Cognito ユーザープール
ユーザーディレクトリを作成し、アプリケーションにユーザー登録/サインインの機能を追加できるサービスです。ユーザープールを使用することで、ユーザーがメールアドレスや電話番号などを使って登録しサインインできるようになります。
また、何百万ものユーザーに拡張できることは開発者にとってうれしいことです。アプリケーションの中でユーザー登録/サインインを処理したい場合はユーザープールがオススメです。
Amazon Cognito フェデレーテッドアイデンティティ
FacabookやTwitter、Googleなどの外部認証プロバイダーやユーザープールと連携し、ユーザーごとにIDを作成し、権限を制限したAWSの認証情報を取得することができます。
これにより、次に説明するCognito Syncによるデータの同期をしたり、S3やDynamoDbなどの各サービスにユーザーがアクセスしたりできます。
Amazon Cognito Sync
アプリケーションに関連したユーザーのデータをデバイス間で同期できるサービスです。独自にバックエンドを開発せずとも、ウェブとモバイル間でデータを同期することができます。
今回やること
こんな便利なAmazon Cognitoですが、今回は実際にFacebookを利用してAmazon Cognito フェデレーテッドアイデンティティ経由でAWSに認証させ、一時的にアクセスキー・シークレットキーを払い出すように設定してみたいと思います。
手順
Facebook開発者登録をし、Facebookアプリを作成します。またフェデレ―テッドアイデンティでIDプールを作成します。その後、Facebook開発者ページからユーザーアクセストークンを取得し、そのトークンでフェデレ―テッドアイデンティティからIDを取得します。最後にアクセスキー・シークレットキーが払い出されているか確認します。それでは1つ1つ見ていきましょう。
①Facebookアプリを作成する。
まずは開発者向けFacebookページの右上にある「スタート」からアカウントを作成します。Facebookのアカウントがあればそのアカウントでログイン可能です。
アカウント作成するとアプリを作成させられます。適当な表示名とメールアドレスを入力しアプリを作成しましょう。
アプリを作成すると作成されたアプリの画面に移ります。画面の上の方や設定またはダッシュボードからアプリIDが確認できます。このアプリIDはCognitoの設定をする際に使用します。
②フェデレ―テッドアイデンティでIDプールを作成する
AWSのマネジメントコンソールからCognitoを開くと以下の画像のようになります。「フェデレ―テッドアイデンティティの管理」を選択し、IDプールを作成していきます。
IDプール名と認証プロバイダーを設定します。IDプール名は適当なわかりやすいものをつけておいてください。認証プロバイダーはFacebookのタブを選択し、先ほど登場したアプリIDを入力します。
次にIDに付与する権限をIAMロールで設定いますが、今回はデフォルトのままで「許可」を選択します。ちなみにデフォルトのポリシーは下の画像の用になっています。
さて、これでIDプールが作成されました。「IDプールの編集」からIDプールのIDが確認できます。このIDプールのIDはアクセスキー・シークレットキーを払い出す時に使用します。
③一時アクセスキー・シークレットキーの払い出し
最後に認証情報の取得、つまり一時的なアクセスキー・シークレットキーの払い出しを行います。ここの手順はプログラムを書いて行います。CognitoのドキュメントにはJavaScriptやObject-cなどの例が紹介されています。私は今回、Amazon Linux上でPython3.6で行いました。
プログラムを書く前に、Facebookのユーザーアクセストークンを取得します。Facebook開発者ページの「ツール&サポート」のタブの「アクセストークンツール」からテスト用のトークンをコピーできます。
PythonでAWSのリソースを操作するために事前にboto3のインストールをしておきましょう。またCLIのRegionを設定しておかないといけません。
1
2 $ sudo pip install boto3
3 $ aws configure
4
1
2 AWS Access Key ID [None]:
3 AWS Secret Access Key [None]:
4 Default region name [None]: ap-northeast-1
5 Default output format [None]:
6
以下がPythonで実行したコードになります。"IDプールのID"の部分は先ほど確認したIDプールのIDを入力してください。また"テスト用ユーザーアクセストークン"の部分はFacebook開発者ページからコピーしたユーザーアクセストークンを入力してください。
入力
1
2 >>> import boto3
3 >>> CognitoIdentity = boto3.client("cognito-identity")
4 >>> CognitoIdentity.get_id(IdentityPoolId="IDプールのID", Logins={"graph.facebook.com":"テスト用ユーザーアクセストークン"})
5
出力
1
2 {
3 'IdentityId': 'アイデンティティID',
4 'ResponseMetadata':
5 {"略"}
6 }
7
入力
1
2 >>> CognitoIdentity.get_credentials_for_identity(IdentityId="IDプールのID", Logins={"graph.facebook.com":"テスト用ユーザーアクセストークン"})
3
出力
1
2 {
3 'IdentityId': 'IDプールのID"',
4 'Credentials':
5 {
6 'AccessKeyId': 'アクセスキーID',
7 'SecretKey': 'シークレットキー',
8 'SessionToken': 'セッショントークン',
9 'Expiration': datetime.datetime(2017, 12, 21, 8, 30, 11, tzinfo=tzlocal())
10 },
11 'ResponseMetadata':
12 {"略"}
13}
↑のようにアクセスキー・シークレットキーが得られます。IDプールはどうなっているのでしょうか?
おっ!?
おおうっ!!
IDが作成されています。
補足:一時的な認証情報について
ここで得られた一時的な認証情報、つまりアクセスキーとシークレットキーは有効期限が過ぎるとAWSでは認識されなくなるのでご注意ください。また、通常のIAMユーザーの認証情報とは違い、ユーザーからのリクエストがあればその都度生成されます。
これらのことは、アプリケーションに認証情報を埋め込まなくてもよい、不要な認証情報をいちいち削除しなくてもよいという利点があるということでもあります。
詳しくはAWSドキュメント『一時的セキュリティ認証情報』をご覧ください。
最後に
いかがでしたか?今回はFacebookとCognitoを利用してユーザーにアクセスキー・シークレットキーの払い出すところまでをやってみました。
もちろんFacebookだけでなく、TwitterやGoogle、またはユーザープールのユーザーにキーを払い出すこともできます。ロールのポリシーを編集すればキーを払い出したユーザーにS3やDynamoDBなどにアクセスする権限を付与することもできます。
Cognitoを利用すればAWS上のアプリケーションにて、簡単にユーザー認証・リソース権限付与ができるというわけですね。