質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

6679閲覧

nuxtのAuth Moduleでの認証済み時のリロードで常にログイン画面に遷移してしまう。

tomomo

総合スコア430

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

1クリップ

投稿2020/06/03 11:55

編集2020/06/04 09:05

NuxtでAuth Moduleを使ってログイン画面を作成しています。
バックエンド(API)側はPHP(php-jwt)で実装し、独自の認証処理を行なっています。

Nuxtの設定、nuxt.config.tsauthは以下のとおりです。

javascript

1: 2 auth: { 3 redirect: { 4 login: '/login', 5 logout: '/', 6 callback: false, 7 home: '/' 8 }, 9 10 strategies: { 11 local: { 12 endpoints: { 13 login: { url: '/auth/login', method: 'post', propertyName: 'token' }, 14 logout: { url: '/auth/logout', method: 'post' }, 15 user: { url: '/auth/user', method: 'get', propertyName: 'user' } 16 } 17 } 18 } 19 }, 20:

そしてサンプルに習い、以下のミドルウェアを作成し、対象のページに適用しました。

typescript

1import { Middleware } from '@nuxt/types'; 2 3const userAuth: Middleware = ({ store, redirect }) => { 4 if (!store.state.auth.loggedIn) { 5 redirect('/login'); 6 } 7}; 8export default userAuth; 9

この時、認証済みにおいても画面を更新した際(例えばF5を押した時)、ログインの画面の方へ遷移してしまうのです。
これはendpointsのuser、/auth/userの結果を待たず、先のミドルウェアの方が先に判断しているものと思っています。($authを表示させたところ、数秒後に表示されるので多分そうだと思います。)

前にVueでSPAを作成したときは以下のような方法を取っていましたが、nuxtにおけるトップ(index)がよくわからなく、ましてやAuthModuleを提供してるくらいなので、もう少し一般的、ベターなやり方があるのではと思い、質問させていただきました次第です。

jvascript

1// index.js 2(async () => { 3 // これだと認証情報を取得するまで待ってくれる。 4 await store.dispatch('auth/currentUser'); 5 6 new Vue({ 7 router, 8 store, 9 render: h => h(App) 10 }).$mount('#app'); 11 12})();

$authの...監視をするのだろうか?(それをどこに作る?)
そもそも設定やモジュールの使い方が違う?
それとも・・・
(※Nuxtは初心者です。)

ぜひご教授いただきたく。
よろしくお願いします。

追記)
もう少し状況を補足。

  • 認証済みのとき、/(ルート)へアクセス。(あるいはリロード)
  • middlewareが働いてstore.state.auth.loggedInが空のため、/loginに遷移する。
  • ログイン遷移後、endpointsuser(/auth/user)が作動する。
  • 認証しているので結果が$authには反映されている。

...がそのあと何も動かない。
$authの監視をするためにログイン画面に以下のコードを追記してみたが、拾えず。。。

javascript

1 computed: { 2 loggedIn () { 3 return this.$auth.loggedIn; 4 } 5 }, 6 7 watch: { 8 loggedIn () { 9 alert('変わった!!!'); 10 } 11 }

endpointsのuserのコールバック的なのか必要なのだけど、どのようにすればいいのか。。。

さらに追記)

ログイン画面に$authを表示させたイメージを載せてみました。
URLを叩いたときのログイン画面に移行。最初loggedInがfalseなのがちょっと間を置いてtrueになる感じです。(なのでmiddlewareのそれが先に判定されているものと思っています。)

認証済みのアクセス

あと作成したミドルウェアをやめ、標準の書き方(?)を試してみました。
が、これも変わらずです。
何か実装が必要なのでしょうか?

typescript

1## nuxt.config.ts 2: 3 router: { 4 middleware: ['auth'] 5 } 6:

vue

1# pages/index.vue 2: 3<script lang="ts"> 4import Vue from 'vue'; 5import Home from '~/components/templates/Home/index.vue'; 6export default Vue.extend({ 7 auth: true, 8 : 9</script>

引き続き募集します。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自分の(開発環境)構成の場合、proxyモジュールが必須で、下記のように書くことで正常に稼働しました。
(あとこれは関係ないですが、/auth/...としてたところをAPI側のパスを変更し、/api/auth/...に変更しました。ドキュメントのそれと合わせることにしました。)
従って標準のAuthを使うのであればミドルウェアも書く必要ないようです。

## nuxt.config.ts axios: { // baseURL: 'http://localhost/' proxy: true }, proxy: { '/api': { target: 'http://localhost', pathRewrite: { '^/api': '/' } } }, auth: { strategies: { local: { endpoints: { login: { url: '/api/auth/login', method: 'post', propertyName: 'token' }, logout: { url: '/api/auth/logout', method: 'post' }, user: { url: '/api/auth/user', method: 'get', propertyName: 'user' } } } }, redirect: { login: '/login', logout: '/login', # <- ここだけ少し気に入らないが。 home: '/' } }

投稿2020/06/07 11:27

tomomo

総合スコア430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問