前回の続きで、Cognitoを使ったユーザ認証を行う。
#やりたいこと
APIでログイン
- ログイン名 と パスワードをリクエストボディに指定しAPIをコールしアクセストークンを取得する
#やってみよう
###Lambda用IAMロール
前回同様に、Lambdaの基本的なポリシーに加えて、「AmazonCognitoPowerUser」をアタッチする。
###ログイン用のLambda関数を作成
前回と異なっていた点ですが、引数に渡すUSERNAME・PASSWORDは大文字で記載しないとエラーになりました。
index.js
'use strict';
const AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider();
/**
* SignIn
*/
exports.handler = async (event, context) => {
const response = {};
let loginName;
let password;
console.log(event);
// Validation
if (!(event.body) || !('loginName' in JSON.parse(event.body)) || !('password' in JSON.parse(event.body))) {
response["statusCode"] = 400;
return response;
} else {
let reqestBody = JSON.parse(event.body);
loginName = reqestBody["loginName"];
password = reqestBody["password"];
}
// SignIn parameters
const params = {
AuthFlow: 'USER_PASSWORD_AUTH',
ClientId: process.env['APP_CLIENT_ID'],
AuthParameters: {
USERNAME : loginName,
PASSWORD: password
}
};
response["headers"] = {"Access-Control-Allow-Origin" : "*", "Content-Type" : "application/json"};
// SignIn
try {
const result = await cognito.initiateAuth(params).promise();
console.log('User sign in success!!!', JSON.stringify(result, null, 4));
response["statusCode"] = 200;
response["body"] = JSON.stringify(result['AuthenticationResult']);
return response;
}
catch(err) {
console.log('User sign in failed...' + err);
if ((err.code == 'NotAuthorizedException') || (err.code == 'UserNotConfirmedException')) {
response["statusCode"] = 400;
} else {
response["statusCode"] = 500;
}
return response;
}
};
###API Gateway リソース・メソッドの追加
前回同様、「Lambdaプロキシの統合」にチェックを入れ、作成したLambda関数を選択する。
無事にアクセストークンが取得できたので、目的達成!!!
#感想
レスポンスの有効期限(expired)が3600なのでん?と思ったら、アクセストークン・IDトークンの有効期限は1時間固定のよう。
変更できないのか?? 調べておきます。
アプリクライアントの設定で指定したトークンの有効期限はリフレッシュトークンの有効期限のことである。
#今後の宿題
- ユーザ情報を取得する