Nuxt Auth 如何从数据库中删除刷新令牌?

Posted

技术标签:

【中文标题】Nuxt Auth 如何从数据库中删除刷新令牌?【英文标题】:Nuxt Auth how to delete refresh token from database? 【发布时间】:2021-10-14 03:45:03 【问题描述】:

我在我的应用程序中实现 Nuxt Auth(本地/刷新)已完成一半。我在数据库中有一个存储刷新令牌的表,我想在 Nuxt Auth 注销时从数据库中删除刷新令牌。 Nuxt Auth 没有将刷新令牌发送到我的端点,因此我无法查找它并将其从数据库中删除。

Nuxt Auth 在登录时正确获取令牌和用户详细信息,并正确调用我的注销 API 端点,它只是发送一个空正文。

package.json:

"@nuxtjs/auth-next": "^5.0.0-1624817847.21691f1",

nuxt.config:

auth: 
  strategies: 
    local: 
      scheme: 'refresh',
      token: 
        property: 'accessToken',
        maxAge: 1800,
        global: true,
      ,
      refreshToken: 
        property: 'refreshToken',
        data: 'refreshToken',
        maxAge: 60 * 60 * 24 * 30
      ,
      endpoints: 
        login: url: '/login', method: 'post',
        refresh:  url: '/token', method: 'post',
        logout: url: '/logout', method: 'delete',
        user: url: '/user', method: 'get'
      ,
      user: 
        property: false,
      ,
      tokenRequired: true,
      tokenType: 'bearer'
    
  

API 端点:

router.delete('/logout', async (req, res) => 
  const sql =`DELETE FROM tokens WHERE id = '$req.body.refreshToken'`
  await pool.query(sql)
  res.sendStatus(204)
)

【问题讨论】:

【参考方案1】:

经过大量调试和控制台日志记录后,这是我的解决方案: 将this.$auth.logout()(基本上你在按下注销按钮时调用此方法)更改为:

this.$auth.logout(
  data: 
    refreshToken: this.$auth.strategies.local.refreshToken.get(),
  ,
)

PS:如果您将您的策略​​(在 nuxt.config.js 中)称为“本地”以外的其他名称,您还应该将 this.$auth.strategies.local.refreshToken.get() 更改为:this.$auth.strategies.'your strategy name'.refreshToken.get()

【讨论】:

【参考方案2】:

您绝对应该通过 HTTP 发送 SQL。 要么通过/expire 等路径向后端发送一些 ID,要么让令牌自行过期。

我的公司正在使用 5 分钟的令牌到期时间。这意味着每 5 分钟,令牌就会过期并使用 refresh_token 刷新。 如果你愿意,你可以进一步降低这个值,比如 1 分钟。

但这是一个后端问题,需要更多代码。 甚至是我会说的需求问题。

【讨论】:

我理解刷新令牌的概念,这就是我想要做的。我不确定我的问题是否明确指出这是一个专门关于 Nuxt/Auth 包的问题。 refresh_token 可以在您的浏览器中找到。在 cookie 或 localStorage 中,具体取决于您的设置。只需从那里删除它。 是的,Nuxt/Auth 已经自动为我从 cookies/localstorage 中删除了令牌。但是,它提供了一个用于注销的 API 调用,从我在文档中阅读的内容来看,它似乎旨在将刷新令牌发送回 API“删除”端点(refreshToken.data 属性)。我总是可以从 cookie 中获取令牌,但我希望不必进行 2 个 API 调用,因为它可以在 Nuxt/Auth 提供的一个中完成。 最简单的调试方法是在 Nuxt 应用程序中注销,让nuxt/auth 将有效负载发送到 API 上的/logout 路径,然后在路由器或路由器中查看结果控制器。无需进行 2 次 API 调用。 是的,这就是我一直在做的事情,也是促使我提出这个问题的原因。我在后端的授权标头中获取了 accessToken,但是找不到 refreshToken。 Nuxt/Auth 在删除请求中发送一个空正文。我还尝试将请求从“删除”更改为“发布”,但无济于事。

以上是关于Nuxt Auth 如何从数据库中删除刷新令牌?的主要内容,如果未能解决你的问题,请参考以下文章

令牌过期时,Nuxt Auth Module c5 不会自动刷新令牌

如何从 Firebase.auth.currentUser Android Kotlin 获取刷新令牌

在 Nuxt asyncData 中使用 axios 在浏览器刷新时丢失令牌

在 Nuxt auth-module 中设置令牌

浏览器刷新后 Nuxt auth 用户重置

登录后无法立即获取用户,但刷新工作@nuxt-auth