AWSの認定は保有していますが
実践できていない主なサービスがサーバレスまわり…
ということで勉強を兼ねて、簡単なAPIを作成してみます。
やりたいこと
APIでユーザ作成
- username と passwordをリクエストボディに指定しAPIをコールするだけでユーザ作成する。
- メールアドレス/電話番号の認証は不要。
参考
やってみよう!
ユーザプールの作成
こんな私でもCognitoでユーザ管理をするにはユーザプールを作成しなければならないことは知っている。
認証フローはよくわからないため全てチェック。※今後勉強します
ALLOW_USER_PASSWORD_AUTH が絶対必要
「クライアントシークレットを作成」にはチェックを入れないこと。
Lambda用IAMロール
Lambdaの基本的なポリシーに加えて、「AmazonCognitoPowerUser」をアタッチする。
ユーザ作成用のLambdaを作成
今回、ソースコード内のアプリクライアントIDはLambdaの環境変数にセット
バリデーションやエラー処理は適当なので、適宜変更をお願いします
index.js
'use strict';constAWS=require('aws-sdk');constcognito=newAWS.CognitoIdentityServiceProvider();/**
* SignUp
* @param {string} loginName
* @param {string} password
* @returns {Promise<Object>} statusCode,headers,body
*/exports.handler=async(event,context)=>{constresponse={};letloginName;letpassword;console.log(event);// Validationif(!(event.body)||!('loginName'inJSON.parse(event.body))||!('password'inJSON.parse(event.body))){response["statusCode"]=400;returnresponse;}else{letreqestBody=JSON.parse(event.body);loginName=reqestBody["loginName"];password=reqestBody["password"];}// SignUp parametersconstparams={ClientId:process.env['APP_CLIENT_ID'],Username:loginName,Password:password};response["headers"]={"Access-Control-Allow-Origin":"*","Content-Type":"application/json"};// SignUptry{constuser=awaitcognito.signUp(params).promise();console.log('User sign up success!!!',JSON.stringify(user,null,4));response["statusCode"]=201;response["body"]=JSON.stringify({"loginName":loginName});returnresponse;}catch(err){console.log('User sign up failed...'+err);if(err.code=='UsernameExistsException'){response["statusCode"]=409;}elseif(err.code=='InvalidPasswordException'){response["statusCode"]=400;}else{response["statusCode"]=500;}returnresponse;}};
Lambdaのテスト
API Gatewayの作成
「Lambdaプロキシの統合」にチェックを入れ、作成したLambda関数を選択する。
今後の宿題
- 作成したユーザのステータスがUNCONFIRMEDなので,CONFIRMに変更するプログラムを追加する
- APIでユーザ認証をし、アクセストークンを取得する
- APIでユーザ情報を取得する