ユーザPoolの作成
CloudFormationのtemplate.yamlとして記述しました。
cognito-template.yaml
Resources: UserPool: Type: 'AWS::Cognito::UserPool' Properties: Schema: - Name: 'email' StringAttributeConstraints: MinLength: '0' MaxLength: '2048' Required: true AttributeDataType: 'String' Mutable: true AliasAttributes: ['email'] AutoVerifiedAttributes: ['email'] EmailVerificationSubject: 'Your verivication code' EmailVerificationMessage: 'Your confirmation code is {####}.' MfaConfiguration: 'OFF' UserPoolName: Ref: AWS::StackName Policies: PasswordPolicy: RequireLowercase: false RequireSymbols: false RequireNumbers: false MinimumLength: 6 RequireUppercase: false UserPoolClient: Type: "AWS::Cognito::UserPoolClient" Properties: ClientName: 'your-app-name' GenerateSecret: false UserPoolId: !Ref UserPool Outputs: UserPoolId: Value: !Ref UserPool UserPoolClientId: Value: !Ref UserPoolClient
認証要素はデフォルトでusername(twitterでいうところの@マークID)とpassword。多分、usernameは外せない?ので、emailのみを認証要素に使いたい場合はusernameにemailの入力を案内して、cognitoにemail値を送信すればよい。
上記の例では、username
oremail
で認証可能とし、emailはAliasAttributes: ['email']
でusernameの代替として使用できるよう設定しています。
AutoVerifiedAttributes: ['email']
はメールの受信確認を行う。ユーザはEmailVerificationMessage
に記載されている{####}
内に埋め込まれた数値を確認し、入力することでsignupを完了させる。
UserPoolClient
はCognitoを使用するアプリケーションを登録する設定。アプリケーションは払い出されたUserPoolClientIDを使用してCognitoにアクセスする。
CloudFormationでCognitoユーザプールを作成
Cognito ユーザPoolの作成
$ aws cloudformation create-stack --stack-name your-user-pool-name \ --region ap-northeast-1 --template-body file://cognito-template.yaml
UserPoolClientIDとUserPoolIDの確認
$ aws cloudformation describe-stacks --stack-name your-user-pool-name --region ap-northeast-1
Signupの実装
JavaScriptからの実装例を記述します。
依存ライブラリのインストール
AWS & Cognito SDKのインストール
$ npm install aws-sdk --save $ npm install amazon-cognito-identity-js --save
Signupの処理記述
import { CognitoUserPool, CognitoUserAttribute, CognitoUser } from 'amazon-cognito-identity-js' export default { singup: function (username, email, password) { var poolData = { UserPoolId: yourUserPoolID, ClientId: UserPoolClientID } var userPool = new CognitoUserPool(poolData) var attributeList = [] var dataEmail = { Name: 'email', Value: email } var attributeEmail = new CognitoUserAttribute(dataEmail) attributeList.push(attributeEmail) return new Promise((resolve, reject) => { userPool.signUp(username, password, attributeList, null, function (err, result) { if (err) { console.log(err) reject(err) } else { console.log('username is ' + result.user.getUsername()) resolve(result) } }) }) } }
singup
メソッドの各引数に入力されたusername,email,password
を渡して呼び出せばよい。
あとは呼び出し元で、Promiseに対するresolve、reject時のコールバックを記述すればよい。
この時点でEmail未確認のユーザPoolレコードが作成されます。
また、userPool.signUpが成功すれば、入力email宛てにAWSから自動でメール送信が行われます。
Emailの存在確認
Emailに記述された認証コードの確認をします。
import { CognitoUserPool, CognitoUserAttribute, CognitoUser } from 'amazon-cognito-identity-js' export default { singup: function (username, email, password) { //...略 }, confirm: function (username, confirmation_number) { var _this = this var poolData = { UserPoolId: yourUserPoolId, ClientId: yourUserPoolClientId } var userPool = new CognitoUserPool(poolData) var userData = { Username: username, Pool: userPool } var cognitoUser = new CognitoUser(userData) return new Promise((resolve, reject) => { cognitoUser.confirmRegistration(confirmation_number, true, function (err, result) { if (err) { console.log(err) reject(err) } else { console.log('call result: ' + result) resolve(result) } }) }) } }
引数confirmation_number
にユーザが入力した確認用数値列を渡せばよい。
cognitoUser.confirmRegistration
が成功すると対象のユーザPoolレコードがEメール確認済み CONFIRMED
となります。