非同期認証状態リクエストでのVuejsルートナビゲーションガード

ブランドンデオ

vuejsアプリで認証を行うためにfirebaseを使用しています。私のルート(main.js)のvueコンポーネント。

  created() {
    auth.onAuthStateChanged((user) => {
      this.$store.commit('user/SET_USER', user);
      if (user && user.emailVerified) {
        this.$store.dispatch('user/UPDATE_VERIFIED', {
          userId: user.uid,
        });
        // SUCCESSFUL LOGIN
        this.$router.replace('dashboard');
      } else if (user && !user.emailVerified) {
        this.$router.replace('verify');
      }
    });

つまり、基本的に、ルーターのナビゲーションガードは、認証ステータスをチェックし、各ルートの前にもルーティングを実行しています。

router.beforeEach((to, from, next) => {
  const currentUser = firebaseApp.auth().currentUser;
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth);
  const allowUnverified = to.matched.some(record => record.meta.allowUnverified);

  if (requiresAuth && !currentUser) {
    next('login');
  } else if (currentUser
              && !currentUser.emailVerified
              && !allowUnverified
              && to.path !== '/verify') {
    next('verify');
  } else if (!requiresAuth && currentUser) {
    next('dashboard');
  } else {
    next();
  }
});

(有効な認証トークンを使用して)ページを更新すると、ルートガードのブランチ1であるstateChangesにアクセスし、ハンドラーが呼び出されて/ dashboardにリダイレクトされます。そのため、ログイン中に更新すると、現在のルートではなく、常にダッシュボードルートに移動します。

このケースをどのように処理できますか?各認証コンポーネントにbeforeEnterガードを追加すると、データフェッチVueドキュメントに悪臭がします

これは、ルートインスタンスで作成されたフックではなく、ストアにある必要がありますか?どんな助けでも大歓迎です。このパターンは私を困惑させています。

エミールベルジェロン

クイックフィックス

ユーザーが存在し、認証を必要としない場合、なぜユーザーを別のページ(ダッシュボード)にリダイレクトするのですか?

  } else if (!requiresAuth && currentUser) {
    next('dashboard');
  } else {
    next();
  }

ルーティングを続行させることができます。

  if (requiresAuth && !currentUser) {
    next('login');
  } else if (requiresAuth && !currentUser.emailVerified && !allowUnverified) {
    next('verify');
  } else {
    next();
  }

またthis.$router.replace('dashboard');onAuthStateChangedコールバックから削除する必要があります。より詳細な回答については、以下を参照してください。

深く

Vueコンポーネント認証ルーティングロジックを配置することは避けます。いつかは理にかなっているかもしれませんが、この場合は完全に回避できます。

Vuexストアインスタンスを分離されたモジュールに配置して、Vueに限らず他の場所で使用できるようにするのが好きです。

import Vue from 'vue';
import Vuex from 'vuex';
// Configuration is generated with a function, so testing the store is easier
import getConfig from './config';

Vue.use(Vuex);

export default new Vuex.Store(getConfig());

したがって、認証ロジックをauth.jsサービスに移動できます

import store from './store';
import router from './router';

// other auth related code, you can even export a common API
// to use within your app.
// like this simple wrapper, which hides the fact that you're using firebase
export function getUser() {
  return firebaseApp.auth().currentUser;
}
export default { getUser }

auth.onAuthStateChanged((user) => {
  // store/business logic should be inside the store.
  store.dispatch('user/AUTH_STATE_CHANGED', user);
  // minimal handling of mandatory steps in the login or sign up process
  if (!user) {
     router.push('login');
  } else if (user && !user.emailVerified) {
    router.push('verify');
  }
});

ユーザーが正しくログインしている場合、ここにリダイレクトする理由はありません。グローバルナビゲーションガードがほとんどのリダイレクト作業を実行するため、router.go()またはを使用して現在のルートにリダイレクトrouter.push(router.currentRoute)できます

実際、このナビゲーションガードはauth.js上記サービス内に登録することができます

router.beforeEach((to, from, next) => {
  const currentUser = getUser();
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth);
  const allowUnverified = to.matched.some(record => record.meta.allowUnverified);

  if (requiresAuth && !currentUser) {
    next('login');
  } else if (requiresAuth && !currentUser.emailVerified && !allowUnverified) {
    next('verify');
  } else {
    next();
  }
});

次に、ログインすると到達できないルートに簡単なナビゲーションガードを追加します。

path: '/login',
beforeEnter: (to, from, next) => {
    if (auth.getUser()) {
        next('dashboard');
    } else {
        next();
    }
},

重要なのは、制限されたページに移動するときにのみリダイレクトを強制することです。

ログインしたユーザーがページを更新するときに、にリダイレクトする理由はありません/dashboard同じユーザーがログインに移動しようとする場合は、にリダイレクトする理由があります/dashboard

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

コンポーネントナビゲーションガードでのVueルーターのテスト

分類Dev

Reactスタックナビゲーション、ルートなしで状態を渡す方法

分類Dev

ナビゲーションバーがホバー/スクロールで状態を変更したときにブートストラップナビゲーションバーのロゴ画像を変更する

分類Dev

ナビゲーションドロワーのトグルは状態を変更しません

分類Dev

非同期アクションVuexで状態をロード

分類Dev

状態ドローアブルを使用してナビゲーションドロワーのtextViewのテキストカラーを変更する方法

分類Dev

自動生成コードのトリガーAndroidナビゲーション

分類Dev

非同期リクエストでのフォーム認証の実装

分類Dev

NEHotspotHelper:認証ステートマシンの認証状態でWebリクエストを送信できません

分類Dev

酵素:「クリック」のシミュレーションで、非同期的に変更された状態値をテストします

分類Dev

反応でブートストラップナビゲーションバーのアクティブ状態を管理する方法は?

分類Dev

ナビゲーションルートの状態に反応して、キーとインデックスを作成します

分類Dev

非同期機能でナビゲート - ネイティブに反応 - ナビゲーションに反応

分類Dev

リクエストおよびガベージコレクション中のWCF非同期

分類Dev

Angularcliフロントエンドがスタックした状態でリレーショナルデータを取得する

分類Dev

シングルトンクラスの列挙型の状態を使用して、SwiftUIのビューでアラートをトリガーする方法

分類Dev

Jenkins「トリガーはリモートでビルドします」>「認証トークン」オプションがありません

分類Dev

状態のバックグラウンド検証、ユーザーアクションでリセット

分類Dev

jpaクエリでの結合ナビゲーションとパスナビゲーションの違い

分類Dev

Androidナビゲーションドロワーフラグメントの状態

分類Dev

ブートストラップナビゲーションバーのリンクエラー

分類Dev

ブートストラップナビゲーションバーのリンクエラー

分類Dev

リスト行ごとに2つのナビゲーションリンクで途切れるSwiftUIナビゲーションコントローラー

分類Dev

タブバー状態でのナビゲーション履歴のスタックを回避する方法

分類Dev

ナビゲーションドロワーのリストビューを更新

分類Dev

ドロワーナビゲーション(リストビューと画像のタイトルを追加)

分類Dev

マルチデリゲート非同期アクションはBeginInvokeでのみ機能します

分類Dev

タブバーとナビゲーションコントローラーアプリでの状態の復元

分類Dev

ブートストラップナビゲーションバーで.active状態を変更できないのはなぜですか?

Related 関連記事

  1. 1

    コンポーネントナビゲーションガードでのVueルーターのテスト

  2. 2

    Reactスタックナビゲーション、ルートなしで状態を渡す方法

  3. 3

    ナビゲーションバーがホバー/スクロールで状態を変更したときにブートストラップナビゲーションバーのロゴ画像を変更する

  4. 4

    ナビゲーションドロワーのトグルは状態を変更しません

  5. 5

    非同期アクションVuexで状態をロード

  6. 6

    状態ドローアブルを使用してナビゲーションドロワーのtextViewのテキストカラーを変更する方法

  7. 7

    自動生成コードのトリガーAndroidナビゲーション

  8. 8

    非同期リクエストでのフォーム認証の実装

  9. 9

    NEHotspotHelper:認証ステートマシンの認証状態でWebリクエストを送信できません

  10. 10

    酵素:「クリック」のシミュレーションで、非同期的に変更された状態値をテストします

  11. 11

    反応でブートストラップナビゲーションバーのアクティブ状態を管理する方法は?

  12. 12

    ナビゲーションルートの状態に反応して、キーとインデックスを作成します

  13. 13

    非同期機能でナビゲート - ネイティブに反応 - ナビゲーションに反応

  14. 14

    リクエストおよびガベージコレクション中のWCF非同期

  15. 15

    Angularcliフロントエンドがスタックした状態でリレーショナルデータを取得する

  16. 16

    シングルトンクラスの列挙型の状態を使用して、SwiftUIのビューでアラートをトリガーする方法

  17. 17

    Jenkins「トリガーはリモートでビルドします」>「認証トークン」オプションがありません

  18. 18

    状態のバックグラウンド検証、ユーザーアクションでリセット

  19. 19

    jpaクエリでの結合ナビゲーションとパスナビゲーションの違い

  20. 20

    Androidナビゲーションドロワーフラグメントの状態

  21. 21

    ブートストラップナビゲーションバーのリンクエラー

  22. 22

    ブートストラップナビゲーションバーのリンクエラー

  23. 23

    リスト行ごとに2つのナビゲーションリンクで途切れるSwiftUIナビゲーションコントローラー

  24. 24

    タブバー状態でのナビゲーション履歴のスタックを回避する方法

  25. 25

    ナビゲーションドロワーのリストビューを更新

  26. 26

    ドロワーナビゲーション(リストビューと画像のタイトルを追加)

  27. 27

    マルチデリゲート非同期アクションはBeginInvokeでのみ機能します

  28. 28

    タブバーとナビゲーションコントローラーアプリでの状態の復元

  29. 29

    ブートストラップナビゲーションバーで.active状態を変更できないのはなぜですか?

ホットタグ

アーカイブ