LoginSignup
31
24

More than 5 years have passed since last update.

AWS Cognito UserPoolとIdentityを使ったiOSアプリ認証

Last updated at Posted at 2016-08-05

awslabsのObjective-Cサンプルを参考に、Swift版を作りました。

Kobito.GSZHa0.png

UserPoolでユーザ認証を行い、UserPoolを認証プロバイダーとしてCognito IdentityでCredentialを取得するという流れです。
UserPoolのおかげで認証サーバすらも実装する必要がなくなり、ますますサーバレスな開発が可能となっています。

参考にしたサイト

UserPoolについてはまだあまり記事も多くなく、AWS公式のドキュメントが頼りでした。

言語はObjective-Cですが、awslabsのサンプルは大変参考になります。

アプリ実行方法

1.UserPoolの作成

米国東部リージョン(us-east-1)でUserPoolを作成します。先日東京リージョン(ap-northeast-1)も利用可能になりましたが、SDKのバグ?なのか、うまくいきませんでした。
AWS SDKのバージョン2.4.5までは米国東部リージョン(us-east-1)がハードコードされていたようで東京リージョン(ap-northeast-1)では動作しなかったのですが、2.4.7にアップデートしてから動作するようになりました。
関連Issueは以下です。
https://github.com/aws/aws-sdk-ios/issues/447

2.IdentityPoolの作成

こちらは東京リージョンで作成します。

3.UserPool、IdentityPoolの情報をアプリに記述

Constants.swiftに必要な定数をまとめています。ここに情報を記述すればアプリが実行できるようになっています。

static let COGNITO_IDENTITY_USER_POOL_ID = "YOUR_USER_POOL_ID"
static let COGNITO_IDENTITY_USER_POOL_APP_CLIENT_ID = "YOUR_USER_POOL_APP_CLIENT_ID"
static let COGNITO_IDENTITY_USER_POOL_APP_CLIENT_SECRET = "YOUR_USER_POOL_APP_CLIENT_SECRET"
static let COGNITO_IDENTITY_USER_POOL_KEY = "CognitoUserPool"
static let COGNITO_IDENTITY_POOL_ID = "YOUR_IDENTITY_POOL_ID"

4.依存ライブラリのインストール

podコマンドでインストールしましょう。

$ pod install

コード解説

簡単にポイントだけ、順を追って説明します。
ちなみにログイン機能しかないので事前にUserPoolにユーザを作成しておく必要があります。。

WelcomeViewController

本アプリのメイン画面です。refreshメソッドでUserPoolとの通信を試みていて、ここでユーザ未認証の場合、ログイン画面が表示されます。
ログイン完了後、Welcome Usernameというメッセージが表示されます。

AppDelegate

AWSCognitoIdentityInteractiveAuthenticationDelegateプロトコルを適用し、startPasswordAuthenticationメソッドを実装します。

startPasswordAuthenticationメソッドはユーザが未認証の場合に呼ばれ、LoginViewControllerを起動します。

LoginViewController

AWSCognitoIdentityPasswordAuthenticationプロトコルを適用し、getPasswordAuthenticationDetails:passwordAuthenticationCompletionSource:didCompletePasswordAuthenticationStepWithError:メソッドを実装します。

getPasswordAuthenticationDetails:passwordAuthenticationCompletionSource:メソッドでは、passwordAuthenticationCompletionSourceを受け取ることができます。このオブジェクトには、UserPoolと通信してログインを行うタスクが格納されています。

このタイミングでログイン画面が表示され、ログインボタンがクリックされるとloginTapped:メソッドが実行されます。この中でself.passwordAuthenticationCompletion?.setResult(result)として、ログインタスクを実行します。resultにはログイン画面で取得したユーザ名とパスワードが格納されています。

ログインが完了したらdidCompletePasswordAuthenticationStepWithError:メソッドが実行されます。ここでは、ログインタスクがエラーであればアラートを表示、ログイン成功ならばログイン画面を閉じるという処理をします。

最後に、WelcomeViewControllerに戻って、ログインしたユーザの名前でWelcome Usernameというメッセージが表示されます。

AwsClientManager

Cognito周りの処理はこのシングルトンクラスに閉じ込めています。

少しでもみなさんの参考になれば幸いです^^

31
24
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
31
24