Vue SPA - 检查用户是不是通过身份验证,如果没有则重定向到登录

Posted

技术标签:

【中文标题】Vue SPA - 检查用户是不是通过身份验证,如果没有则重定向到登录【英文标题】:Vue SPA - check if user is authenticated, redirect to login if notVue SPA - 检查用户是否通过身份验证,如果没有则重定向到登录 【发布时间】:2021-10-07 02:37:45 【问题描述】:

我有一个VueJS 单页应用程序,我使用 JWT 身份验证。

我正在尝试弄清楚如何确保用户在页面重新加载后通过身份验证,如果没有,则将其重定向到登录页面。

accessTokenrefreshToken 存储在 cookiesVuex

Vuex.state:

auth: 
        user: ,
        isAuthenticated: false,
        accessToken: null,
        refreshToken: null
    ,

Vuex.actions.refreshToken

    refreshToken: async (state, commit, dispatch) => 
        try 
            await api.jwtRefresh(state.auth.refreshToken).then(response => 
                if (response.status === 200) 
                    dispatch("setAuthData",
                        accessToken:response.data.access,
                        isAuthenticated:true
                    )
                
            ).catch(err => 
                dispatch('logout')
            );
         catch (e) 
            dispatch('logout')
        
    ,

App.vue

export default 
  data: () => (),
  mounted() 
    this.$store.dispatch('setAuthDataFromCookies')
    this.$store.dispatch('refreshToken') // checks if user is authenticated, redirect to login page if not
    this.$router.push('/dashboard')
  

我的想法是尝试刷新 JWT 令牌。如果成功刷新用户可以继续/dashboard。如果没有,用户将被重定向到/login

问题是mounted 不会等到refreshToken 完成,它甚至在刷新令牌之前就立即将用户重定向到/dashboard

我怎样才能让它等待? (想法是refreshToken 将用户重定向到/login 以防出错。

【问题讨论】:

【参考方案1】:

您可以在路由器中设置元 auth 字段,以及检查 Vuex(或您的 cookie,或两者)是否有令牌的全局 beforeEnterbeforeEach 守卫。

在您的 router.js 文件中,您会有类似的内容

routes: [
  
    name: 'Login'
  ,
  
    name: 'Dashboard', // + path, component, etc
    meta: 
      auth: true
    
  
]

然后你设置一个全局守卫,像这样:

router.beforeEach((to, from, next) => 
  if (to.matched.some(record => record.meta.auth)) 
    if (!store.getters.authToken) 
      next( name: 'Login' );
     else 
      next();
    
   else 
    next(); // Very important to call next() in this case!
  
)

这将在每个路由转换之前检查下一个路由是否具有auth 元字段。如果是,它会检查你的 Vuex 状态以获取令牌,否则正常导航。

Vue Router Docs on Navigation Guards

在您的情况下,您正在尝试对用户进行身份验证,因此您可以在 beforeEach 防护内调用您的端点并根据响应进行重定向。只要确保回调异步,如router.beforeEach(async (to, from, next) => )

【讨论】:

以上是关于Vue SPA - 检查用户是不是通过身份验证,如果没有则重定向到登录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 和 Vue.js 中使用 jwt-auth 检查用户是不是经过身份验证

使用 Laravel 作为后端刷新 Vue.js SPA 的身份验证令牌

处理 django rest framework + vue SPA auth

检查用户是不是在 Android 的 Firebase Google 身份验证中首次通过身份验证

Laravel sanctum 检查用户是不是在没有重定向的情况下通过身份验证

如何检查该用户是不是已通过来自美味派的身份验证?