【新機能】Cognitoユーザープールの管理者がユーザーのパスワードを変更出来るようになりました

はじめに

サーバーレス開発部@大阪の岩田です。

タイトルそのままなのですが、CognitoにAdminSetUserPasswordという新しいAPIが追加され、ユーザープールの管理者がユーザーのパスワードを変更出来るようになりました。

Amazon Cognito launches enhanced user password reset API for administrators

aws-amplify-reactのサンプルアプリを使って早速試してみます。

検証用のアプリ作成

まずAmplifyのチュートリアルに従って進めていきます。 まずはアプリの雛形とCognitoユーザープールを作成します。

$ create-react-app myapp
$ cd myapp
$ amplify init
$ amplify add auth
$ amplify push
$ npm install aws-amplify aws-amplify-react

次にApp.jsを編集します

import React from 'react';
import logo from './logo.svg';
import './App.css';

import Amplify from 'aws-amplify';
import awsmobile from './aws-exports';
import { withAuthenticator } from 'aws-amplify-react'; // or 'aws-amplify-react-native';

Amplify.configure(awsmobile);

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default withAuthenticator(App, true);

編集できたらnpm startして、ユーザーを作成します。

作成できました

AdminSetUserPasswordを使ってユーザーのパスワードを変更する

ここからが本題です。 新機能のAdminSetUserPasswordAPIを使って、作成したユーザーのパスワードを変更してきます。今回はAWS Cliを利用します。

AWS Cliのバージョンです

$ aws --version
aws-cli/1.16.153 Python/3.6.5 Darwin/18.2.0 botocore/1.12.143

パスワードを変更します

$ aws cognito-idp admin-set-user-password --user-pool-id <作成したユーザープールのID> --username cm-iwata --password <設定する新しいパスワード>

変更後にマネジメントコンソールから確認してみると

ステータスがFORCE_CHANGE_PASSWORDに更新されています。 今回はオプションに--permanentを指定しなかったので、更新後のパスワードは一時的なパスワードになり、ユーザーのステータスはFORCE_CHANGE_PASSWORDとなります。 オプションに--permanentを指定した場合は更新後のパスワードは恒久的に利用可能なパスワードとなり、ステータスはCONFIRMEDのままです。

更新後のパスワードでログインしてみます。

無事更新後のパスワードでログインに成功し、パスワード変更画面に遷移しました!

まとめ

Cognitoを利用してユーザー管理の基盤を構築しているようなシステムにとっては待望の機能ではないでしょうか?該当する場合はぜひAdminSetUserPasswordを使った機能拡張をご検討ください。