*Nuxt JS Auth* 为啥在模板部分使用 loginWith 成功登录后 auth.loggedIn 为真,但在中间件文件中为假?

Posted

技术标签:

【中文标题】*Nuxt JS Auth* 为啥在模板部分使用 loginWith 成功登录后 auth.loggedIn 为真,但在中间件文件中为假?【英文标题】:*Nuxt JS Auth* Why after success login with loginWith in template sections auth.loggedIn is true, but in middleware file is false?*Nuxt JS Auth* 为什么在模板部分使用 loginWith 成功登录后 auth.loggedIn 为真,但在中间件文件中为假? 【发布时间】:2020-05-28 11:56:57 【问题描述】:

我刚开始学习 NuxtJS,我想通过 auth 模块为 Nuxt 实现身份验证。 我不知道为什么,但是使用 loginWith 登录似乎可以工作,在 vue 文件上我可以获取有关已登录用户的数据,并且 loggedIn 变量具有真实值。但是我注意到当我从 auth 模块设置中间件时,即使我已经登录,服务器总是重定向到登录端点。我看到我可以制作我的中间件文件,但是loginIn 的值为false,所以我无法正确重定向。

index.vue

<template>
    <div id="main-page">
        <panel />
    </div>
</template>

<script>
import panel from "~/components/Panel.vue"


export default 
    middleware: ['authenticated'],
    'components': 
        panel
    ,

;
</script>

我的登录组件:

<template>
    <div id="form-wrapper">
        <b-form-group 
            class="ml-3 mr-5"
            label="Username"
            label-for="id-username"
            :invalid-feedback="invalidFeedback"
            :state='state'
        >
            <b-form-input id="id-username" v-model="username" type="text" placeholder="elo"></b-form-input>        
        </b-form-group>
        <b-form-group 
            class="ml-3 mr-5"
            label="Password"
            label-for="id-password"
            :invalid-feedback="invalidFeedbackPass"
            :state='statePass'
        >
            <b-form-input id="id-password" v-model="password" type="password"></b-form-input>        
        </b-form-group>
        <b-button v-b-modal.login-modal class="ml-3 mr-5" variant="outline-success">Login</b-button>
<div v-if="$auth.loggedIn"> $auth.loggedIn </div> // here is true after login

        <b-modal ref="login-modal" id="login-modal" hide-footer hide-header>
            <p>Login:  username  Hasło:  password </p>
            <b-button @click="loginUser(username, password)">Send</b-button>
        </b-modal>
    </div>    
</template>

<script>
import "bootstrap-vue"
import axios from "axios"

export default 
    name: "loginForm",
    data() 
        return
            username: '',
            password: '',
        
    ,
    props: 

    ,
    methods: 
        async loginUser(loginInfo)
            try 
                await this.$auth.loginWith('local', 
                    data: loginInfo
                );
             catch (e) 
                this.$router.push('/');
            
        

    ,
...
</script>

nuxt.config.js 用于身份验证

auth: 
    strategies: 
      local: 
        endpoints: 
          login:  url: '/auth/token/login/', method: 'post', propertyName: 'auth_token' ,
          logout:  url: '/auth/token/logout/', method: 'post' ,
          user:  url: '/auth/users/me/', method: 'get', propertyName: false 
        ,
        tokenRequired: true,
        tokenType: 'Token',
        tokenName: 'Authorization'
      
    ,

    redirect: 
      login: "/",
      logout: "/",
      home: "/home"
    ,

  ,

中间件中的autenticated.js

export default function ( store, redirect ) 
  console.log(store.state.auth.loggedIn); // here returns false, even after success login
  if (store.state.auth.loggedIn) 
    return redirect('/home')
  

值得一提的是,它在 docker 上运行。也许这是个问题。

更新 我将 nuxt 模式从 s-s-r 更改为 SPA,现在一切都可以从 nuxt auth 模块运行。

但我想在 s-s-r 上工作,所以如果有人有解决方案,请分享。

【问题讨论】:

我找到了解决问题的方法。我将模式从 s-s-r 更改为 SPA,现在重定向工作正常。但我认为 s-s-r 模式比 SPA 更好,所以如果有人找到解决方案,请分享。 您是否检查过答案,例如在线程中:github.com/nuxt-community/auth-module/issues/55? @Michal_Szulc 是的,我检查了这个。我也不将 ENV 的变量用于 axios。现在,当我还在学习 nuxt 时,我为 axios 硬编码了 baseURL。 我读了很多关于这个的帖子,很多人都有同样的问题。但没有人能解释为什么会发生这种情况。目前,当我将模式更改为 SPA 时,一切正常,但对于更大的项目,它可能会对性能和 CEO 产生影响。 【参考方案1】:

我的 nuxt.config.js 也是:

auth: 
 strategies: 
  local: 
    endpoints: 
      login:  url: '/api/login', method: 'post' ,
      logout: false,
      user: false,
    ,
    tokenRequired: true,
  ,
,
rewriteRedirects: false,

 redirect: 
  login: '/login',
  logout: '/login',
  home: '/dashboard',
,

【讨论】:

【参考方案2】:

好吧,我找不到比将 nuxt 的模式更改为 SPA 更好的解决方案。在 SPA 中,一切正常,应该如何。这是我用于身份验证模块的 nuxt.conf.js 片段。

export default
  mode: 'spa',

  modules: [
    '@nuxtjs/axios',
    '@nuxtjs/auth'
  ],

  axios: 
    baseURL: 'http://127.0.0.1:8000/api',
    browserBaseURL: 'http://127.0.0.1:8000/api'
  ,

  auth: 

    strategies: 
      local: 
        endpoints: 
          login:  url: '/auth/token/login/', method: 'post', propertyName: 'auth_token' ,
          logout:  url: '/auth/token/logout/', method: 'post' ,
          user:  url: '/auth/users/me/', method: 'get', propertyName: false 
        ,
        tokenRequired: true,
        tokenType: 'Token',
        tokenName: 'Authorization'
      
    ,
    rewriteRedirects: false,

    redirect: 
      login: "/login",
      logout: "/login",
      home: "/",
    ,
  ,

  router : 
    middleware: ['auth'],
  

【讨论】:

嗯,这并没有解决我的问题,但给了我问题所在的提示。我再次将其更改为spauniversal,我的错误在于登录后的用户请求。我在endpoints 部分中有user: url: '/auth/users/me/', method: 'get', propertyName: 'user' 并将其更改为false,就像你做的那样。我注意到您的解决方案有rewriteRedirects: false,,但使用它可以防止我需要重定向到我的“家”路径。 半天后我放弃并添加了选项 s-s-r: false。 mode: spa 现在已经贬值了,但是如果没有 firebase,srr auth 模块集成可能是不可能的......

以上是关于*Nuxt JS Auth* 为啥在模板部分使用 loginWith 成功登录后 auth.loggedIn 为真,但在中间件文件中为假?的主要内容,如果未能解决你的问题,请参考以下文章

Nuxt.js + Auth(jwt 刷新令牌)

使用 Jest 在 Nuxt 中测试组件时如何添加/模拟 Nuxt Auth 库

如何从 auth-module、Nuxt.js 获取 access_token

我可以在 nuxt.config.js 中访问 nuxt 上下文吗?

使用 nuxt-auth 成功认证后如何获取用户信息

nuxt/auth 如何真正安全?