如何使用 Nuxtjs 实现 Auth0 服务器端?

Posted

技术标签:

【中文标题】如何使用 Nuxtjs 实现 Auth0 服务器端?【英文标题】:How to implement Auth0 server-side with Nuxtjs? 【发布时间】:2019-11-23 11:56:11 【问题描述】:

我有一个 Nuxt 应用,其身份验证已在通用模式下运行。

我正在尝试将身份验证服务转换为 Auth0。我正在关注Vue quickstart,但我发现auth0-js 是一个客户端库,因为它使用了很多在 Nuxt 的服务器端不可用的“窗口”内容。

但是,我通过使其成为客户端插件并将所有功能(即在生命周期挂钩中调用 authservice)包装在 process.client 检查中来使其工作。它的工作原理是“有点”,因为当在未登录的情况下进入受保护的页面时,它会在重定向到登录页面之前闪烁页面(因为它也在服务器端呈现,但只有在它交付后才会进行检查我想是客户端)。

我现在的问题是:我该怎么做才能将检查也添加到服务器端?(或者至少确保之前没有闪烁受保护的页面被重定向)。

到目前为止我已经尝试过:

将有效负载和登录状态保存在商店中并签入一些自定义中间件,但这并没有奏效。

另外,在我看来@nuxt/auth 已经过时了,nuxt auth0 example 也是。当我使用新的 auth0 通用时,它使用 auth0-lock。

有人对如何解决这个问题有建议吗?提前致谢!

【问题讨论】:

【参考方案1】:

不确定这是否会有所帮助,并且只回答了几个问题(很久以前的其他帐户)。


更新..我读了我的答案然后是问题标题(我认为我的答案确实涵盖了你的一些上下文),但关于标题你也可以使用 auth 来查看plugin。然后,您可以在页面被点击之前处理那里的东西。


我不确定您的代码是如何实现的,但这可能会有所帮助(希望如此)。

如果你没有使用Vuex,我强烈推荐它。 Nuxt Vuex Store Guide

// index/store.js
// At least have the store initialized, but its most likely going to be used..
// page.vue
<template>
...
<div v-else-if="!$auth.loggedIn">
   test 
</div>
...
...

data() 
  if (!this.$auth.loggedIn) 
    const test = 'Only this will load, no flash'
    return  test 
  

$auth.loggedIn 是内置的,我在文档中的某个地方读过它

这将解决无闪存问题,您还可以利用加载器屏幕和 asyncData 在渲染视图之前检查state,以避免闪存并在它挂起时填充数据。

您也可以尝试使用 Vuex Actions,我目前正在使用这两个在我现在的过程中。了解nuxtServerInit()

// store/index.js
import axios from 'axios'

export const actions = 
  nuxtServerInit (commit, request) 
    // This is good if you have the user in your request or other server side stuff
    if (request.user) commit('SET_USER', request.user)
  ,
  async GET_USER( commit , username) 
    const user = await axios.get(`/user/$username`)
    if (user) commit('SET_USER', user)
  


export const mutations = 
  SET_USER(state, user) 
    // simple set for now
    state.auth.user = user || null
  

第二个是使用页面本身的fetch()方法组合的。

// page.vue
async fetch( $auth, store ) 
  await store.dispatch('GET_USER', $auth.$state.user)

现在您可以根据需要在代码中调用$auth.user

$auth.user 是我读到的另一个内置 ..somewhere..

您还可以使用$auth.loggedIn 调用$auth.user,以检查user 是否存在于登录$auth.user &amp;&amp; $auth.loggedIn 之上。

可能是this.$auth.&lt;value&gt;,具体取决于您尝试引用它的位置。

我知道asyncData()首先被调用并登录我的服务器,然后data()也在服务器控制台中记录值(falsenull),但在我的勇敢控制台中它们是@987654344 @,我想要一个答案,哈哈

我一直在努力让 Auth0 以我想要的方式使用 JWTs,但随着我不断爬取,我发现了一些有用的部分(即使在旧的演示中,例如你提到过,lock 的东西什么都没有……)。同样就express 和我的API 而言...无论如何,希望这对(某人)有所帮助。

【讨论】:

以上是关于如何使用 Nuxtjs 实现 Auth0 服务器端?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Express / Auth0 后端登录用户

如何在附加 API 服务 Auth0 中获取访问令牌?

未定义 Gridsome 服务器端渲染与窗口中断的 Auth0 身份验证

如何使用 NestJS GraphQL 实现 NuxtJS Apollo

如何将使用@nuxtjs/apollo 模块的nuxt 应用程序部署到heroku?

带有 Auth0 的服务器端 id_token