NuxtでAuth Moduleを使ってログイン画面を作成しています。
バックエンド(API)側はPHP(php-jwt)で実装し、独自の認証処理を行なっています。
Nuxtの設定、nuxt.config.ts
のauth
は以下のとおりです。
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に遷移する。 - ログイン遷移後、
endpoints
のuser(/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>
引き続き募集します。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。