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された値を見ればわりと一発です。
challengeName
とchallengeParam
というパラメータが含まれている場合は、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に入れておくようにすると良いでしょう。