awslabsのObjective-Cサンプルを参考に、Swift版を作りました。
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周りの処理はこのシングルトンクラスに閉じ込めています。
少しでもみなさんの参考になれば幸いです^^