AWSのAmazon CognitoでUserPoolsを使う例って、モバイルやJavascriptを用いたものはよく出ているけど、
例えばRubyでやる場合とかどうすりゃええねん!と思いつつ、なかなか例が出ていなかったのでやってみた。
その記録。
UserPoolsの設定
Step by stepで書くのは面倒だったので、結果だけ貼っておきます。
特に、Appsの部分の「CognitoSampleApp」は、「Generate client secret」のチェックを外しました。
Cognito操作のためIAMユーザを作成
このあとAWS SDKを使用したCognito操作のため、IAMユーザを作成します。
なお、このユーザには「AmazonCognitoPowerUser」ポリシーを割り当てます。
Rubyを利用してユーザ登録
はじめに
AWS SDK for Ruby (Version 2)を用いて、実際に登録してみた。
お試しということで、irbを使ってざくっとやってみた。
irb(main):001:0> require 'aws-sdk-core'
=> true
設定に関してはYAMLファイルを用意しておいた。
内容的には、前述で用意したユーザのACCESS KEY情報(access_key_id, secret_access_key)、Cognitoのリージョン(region)、設定したアプリケーションのクライアントID(client_id)など。
Cognitoで設定したアプリケーションのクライアントID(client_id)は、Appsの設定を参照してください。(黒塗で消した部分)
irbでは以下のように読み込みます。
irb(main):002:0> require 'yaml'
=> true
irb(main):003:0> props = YAML.load(File.read('./credentials.yml'))
=> {"region"=>"us-east-1", "access_key_id"=>"ACCESS_KEY", "secret_access_key"=>"SECRET_ACCESS_KEY", "client_id"=>"xxxxxxxxxxxxxxxxxxxxxxxxxx"}
Sign up(ユーザ登録)
CognitoIdentityProviderのClientを作成します。
irb(main):004:0> client = Aws::CognitoIdentityProvider::Client.new(
irb(main):005:1* region: props['region'],
irb(main):006:1* access_key_id: props['access_key_id'],
irb(main):007:1* secret_access_key: props['secret_access_key'],
irb(main):008:1* )
=> #<Aws::CognitoIdentityProvider::Client>
Sign upでユーザを作ります。
この時、username
はUserPoolの設定でattributeとは異なるものなので注意。
attributeで選択したものは「user_attributes
」にkey-valueの形式で指定していきます。
irb(main):009:0> resp = client.sign_up({
irb(main):010:2* client_id: props['client_id'],
irb(main):011:2* username: "sampleuser",
irb(main):012:2* password: "SamplePassw0rd!",
irb(main):013:2* user_attributes: [
irb(main):014:2* {
irb(main):015:2* name: "email",
irb(main):016:2* value: "sampleuser@example.com"
irb(main):017:2* },
irb(main):018:2* {
irb(main):019:2* name: "nickname",
irb(main):020:2* value: "samplenickname"
irb(main):021:2* }
irb(main):022:2* ],
irb(main):023:2* validation_data: [],
irb(main):024:2* })
=> #<struct Aws::CognitoIdentityProvider::Types::SignUpResponse user_confirmed=false, code_delivery_details=#<struct Aws::CognitoIdentityProvider::Types::CodeDeliveryDetailsType destination="s***@e***.com", delivery_medium="Email", attribute_name="email">>
この時点で、user_attributesのemailに指定したメールアドレスあてに下記のようなメールが届きます。
このメールに記載されているコードを用いて確認します。
Sign up直後のUserPoolの状況
ここで一度UserPoolの内容を確認します。
上記のようにユーザが追加されていることがわかります。
さらにUsernameリンクをクリックすると、下記のような情報が参照できます。
「email_verified false」となっており、まだメールで通知された確認コードによる認証が済んでいない状態です。
確認コードを登録
メール通知された確認コード(confirmation_code)を使って、登録を完了します。
irb(main):025:0> resp = client.confirm_sign_up({
irb(main):026:2* client_id: props['client_id'],
irb(main):027:2* username: "sampleuser",
irb(main):028:2* confirmation_code: "706183", #enter the verification code on email
irb(main):029:2* force_alias_creation: false,
irb(main):030:2* })
=> #<struct Aws::CognitoIdentityProvider::Types::AddCustomAttributesResponse>
確認が完了しました。
確認コード登録完了直後のUserPoolの状況
UserPoolの内容を確認します。
StatusがConfirmedに変更されています。
さらにUsernameリンクをクリックし、詳細情報を参照します。
「email_verified true」となっており、確認完了したことがわかります。