LoginSignup
0
0

Amplify v6に更新してログインできなくなった話

Last updated at Posted at 2024-05-31

前書き

Amplify でホスティングしているページでログインできない問題が発生した。

エラー内容

console
> UserAlreadyAuthenticatedException: There is already a signed in user

Monosnap Image 2024-05-19 18-15-31.png

Amplify/Auth ですでにサインイン済みの状態になっていることがわかった。
サインイン済みの状態でログインページからサインインをしようとするとこのエラーが発生する。
どうやらブラウザバックなどでログインページに遷移した場合、サインイン済みの状態でログインページへ遷移してしまうようだった。

修正前
import { signIn, type SignInInput, type SignInOutput } from "aws-amplify/auth";

// サインイン処理
async function handleSignIn(): Promise<void> {
    // サインイン情報を作成
    const signInInput : SignInInput = {
      username: userId.value,
      password: password.value
    }
    // サインインを実施
    const signInOutput : SignInOutput = await signIn(signInInput);
}

原因と解決手段

少し前に Amplify v6 へのマイグレーションを行ったことに起因すると考えられる。v6 では fetchAuthSession への変更が中心となっており、ログインページ周りでもロジックの修正が必要となる。本件では最後にサインインしたユーザ情報を維持してしまっているため、サインイン処理を実行する前にサインイン情報を持っているか判定し、ある場合は一度サインアウトを実施する必要がある。

修正後
import { signIn, type SignInInput, type SignInOutput, signOut, fetchAuthSession } from "aws-amplify/auth";

// idTokenが存在する(サインイン済み)場合、サインアウトする
const idToken = (await fetchAuthSession()).tokens?.idToken;
if (idToken) {
    await signOut();
}

// サインイン処理
async function handleSignIn(): Promise<void> {
    // サインイン情報を作成
    const signInInput : SignInInput = {
      username: userId.value,
      password: password.value
    }
    // サインインを実施
    const signInOutput : SignInOutput = await signIn(signInInput);
}

あとがき

サインインされた状態を維持するのは望ましくないので、onUnmounted 時にサインアウトするようにするなど他の対処も必要かもしれない。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0