2016年10月1日土曜日

AWS Cognito を使ってユーザのログインを試してみた

概要

前回 Cognito を使ってユーザの登録ができるところまで試しました
今回はその登録したユーザでログインするところを実装してみたいと思います

環境

  • Mac OS X 10.11.6
  • AWS Cognito 2016/09/30 時点
  • Apache httpd 2.4.18
  • Google Chrome 53.0.2785.116 (動作確認用)

事前準備

User Pool, Federated Identities の作成は前回の記事と全く同じなので、前回の記事を参考に作成してください
基本は AWS のマネージメントコンソールでポチポチしていけば OK です

必要なライブラリのダウンロードも前回と同じなので、そこまでは前回の記事を参考にしてください

ログイン処理の実装

登録したユーザでログインするための画面を実装します

  • cd /Library/WebServer/Documents/cognito
  • vim signin.html
<!DOCTYPE html>
<html >
<head>
  <meta charset="UTF-8">
  <title>signin</title>
  <script src="js/jsbn.js"></script>
  <script src="js/jsbn2.js"></script>
  <script src="js/sjcl.js"></script>
  <script src="js/moment.js"></script>
  <script src="js/aws-cognito-sdk.min.js"></script>
  <script src="js/amazon-cognito-identity.min.js"></script>
  <script src="js/aws-sdk.min.js"></script>
  <script src='js/jquery-3.1.1.min.js'></script>
  <script src='js/signin.js'></script>
</head>
<body>
<div>
<div>
<form>
  <h2>ログイン</h2>
  <label for="inputUsername" >ユーザー名</label>
  <input type="text" placeholder="Username" id="name">
  <label for="inputPassword">パスワード</label>
  <input type="password" placeholder="Password" id="password">
  <br />
  <input type="submit" id="login-button" value="ログイン"></input>
</form>
</div>
</div>
</body>
</html>

必要な js ファイルを読み込んでユーザ名とパスワードを送信するためのフォームを作成しています

  • vim js/signin.js
AWS.config.region = 'ap-northeast-1';
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
  IdentityPoolId: 'ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
});
AWSCognito.config.region = 'ap-northeast-1';
AWSCognito.config.credentials = new AWS.CognitoIdentityCredentials({
  IdentityPoolId: 'ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
});
var data = {
  UserPoolId: 'ap-northeast-1_xxxxxxxxx',
  ClientId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
};
var userPool;
var cognitoUser;

$(function() {
  $("#login-button").click(function(event){
    event.preventDefault();
    var authenticationData = {
      Username : $('#name').val(),
      Password : $('#password').val()
    };
    var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);
    userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(data);
    var userData = {
      Username : $('#name').val(),
      Pool : userPool
    };
    cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
    cognitoUser.authenticateUser(authenticationDetails, {
      onSuccess: function (authresult) {
        alert('Login Success');
      },
      onFailure: function(err) {
        alert(err.message);
      },
    });
  });
});

前回と設定する箇所が異なるところが 1 点あります
ClientId の部分が前回は signup_app の App client id でしたが、今回は cognito アプリの App client id を指定してください
他の値は前回と同様で OK です

処理としてはログインボタンが押されたあとで authenticateUser をコールしてユーザ名とパスワードで認証します
問題なく認証できれば「Login Success」とダイアログで表示します

ログインできない場合の主な原因は

  • Incorrect username or password. -> ユーザ名とパスワードが違う
  • User is not confirmed. -> まだ認証許可が降りていない

辺りかと思います
2 つめの「User is not confirmed.」は User Pool の画面から設定することができます
登録されたユーザを選択し「Confirm user」を選択すると confirm され認証できるようになります
try_cognito_confirm_user.png

動作確認

では動作確認してみましょう
問題なく認証に成功すると以下のように表示されると思います
try_cognito_login.png

最後に

前回からの引き続きで今回は AWS Cognito を使ったログイン処理を試してみました
ユーザ登録後には Confirm してあげないとログインできない点がポイントだったかなと思います

とりあえず基本的な動作は確認できました
あとは、AWS のリソース制御やモバイル連携、各種 SNS サービスの認証と連携するあたりが実運用を考えると必要なパーツになるかと思います

今回はお試しとしてやってみただけなので、実際にサービスに組み込む機会があったらその辺りも検証してみたいなと思っています

参考サイト

0 件のコメント:

コメントを投稿