LoginSignup
15
19

More than 5 years have passed since last update.

Rubyを使用してCognito UserPoolにユーザを登録する

Posted at

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」となっており、確認完了したことがわかります。

15
19
1

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
15
19