More than 1 year has passed since last update.

AWSのAmazon CognitoでUserPoolsを使う例って、モバイルやJavascriptを用いたものはよく出ているけど、
例えばRubyでやる場合とかどうすりゃええねん!と思いつつ、なかなか例が出ていなかったのでやってみた。
その記録。

UserPoolsの設定

Step by stepで書くのは面倒だったので、結果だけ貼っておきます。

UserPools設定

特に、Appsの部分の「CognitoSampleApp」は、「Generate client secret」のチェックを外しました。

Appsの作成

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の設定を参照してください。(黒塗で消した部分)

client_idの確認

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に指定したメールアドレスあてに下記のようなメールが届きます。

verification.png

このメールに記載されているコードを用いて確認します。

Sign up直後のUserPoolの状況

ここで一度UserPoolの内容を確認します。

SignUp直後のUserPool

上記のようにユーザが追加されていることがわかります。

さらにUsernameリンクをクリックすると、下記のような情報が参照できます。

SignUp直後のUser

「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の内容を確認します。

確認コード登録完了直後のUserPool

StatusがConfirmedに変更されています。

さらにUsernameリンクをクリックし、詳細情報を参照します。

確認コード登録完了直後のUser

「email_verified true」となっており、確認完了したことがわかります。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.