aws-amplifyを使ったSPAで新規ユーザーにログイン時パスワード変更を強制する

adminCreateUserでユーザーを作成した時など、Cognito User Poolsでは初回ログイン時にパスワードの変更を強制させることができます。 その際のフロントエンドの実装をaws-amplify使ったケ […]

広告ここから
広告ここまで

目次

    adminCreateUserでユーザーを作成した時など、Cognito User Poolsでは初回ログイン時にパスワードの変更を強制させることができます。

    その際のフロントエンドの実装をaws-amplify使ったケースでざっくりまとめました。

    tips: signIn()はresolveで返ってくる

    aws-amplifyでは、Auth.signIn(username, password)でログイン処理を組めます。この関数はPromiseを返してくるので、.then()/ .catch()で結果を拾うことになります。

    import { Auth } from 'aws-amplify';
    function signIn(username, password) {
    return Auth.signIn(username, password)
    .then(() => {message: "Login successfully"})
    .catch(() => {message: "Login failed"})
    }

    で、パスワード変更が必要な場合はログインできない状態なので、例外を返してくる(= .catchに行く)のではと思っていました。が、ソースを見るとresolveなので.then()にくるみたいです。

    ということで「resolveされたからログイン成功だー」という実装にすると、パスワード更新が必要な場合や、MFA設定している場合につらいことになるので要注意です。

    パスワード更新が必要な場合の見分け方

    見分け方ですが、resolveされた値を見ればわりと一発です。

    challengeNamechallengeParamというパラメータが含まれている場合は、MFAやパスワード更新などのアクションが必要なケースになる様子です。

    import { Auth } from 'aws-amplify';
    function signIn(username, password) {
    return Auth.signIn(username, password)
    .then(result => {
    const hasChallenge = Object.prototype.hasOwnProperty.call(result, 'challengeName')
    if (!hasChallenge) return { message: "Login successfully" }
    if (result.challengeName === 'NEW_PASSWORD_REQUIRED') {
    return {message: 'new password required'}
    }
    })
    .catch(() => {message: "Login failed"})
    }

    .challengeParam.requiredAttributesがパスワード更新時の処理に必要となります。Reduxなどで実装している場合はstoreに入れておくようにすると良いでしょう。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark