返回

如何使用 Nuxt 3 和 JWT 建立一个强大的身份验证系统

vue.js

在 Nuxt 3 中构建基于 JWT 的身份验证系统

引言

在现代 Web 应用程序中,建立一个稳固的身份验证系统至关重要。本文将深入探讨如何在 Nuxt 3 中实现基于 JWT(JSON Web 令牌)的身份验证,重点关注通过电子邮件和密码进行登录。

构建登录页面

第一步是创建一个包含登录表单的登录页面组件。确保表单包含电子邮件、密码输入字段以及一个提交按钮。当用户提交表单时,应用程序将收集输入并向 API 发起登录请求。

发送登录请求

接下来,使用 fetch 方法将登录请求发送到 API。请求正文应包含电子邮件、密码和任何其他必需的参数。使用 try-catch 块来处理请求结果,并在成功时提取 JWT 令牌和用户详细信息。

设置全局 JWT 令牌

要保护应用程序的受限区域,需要在 fetch 钩子中设置 Authorization 标头,其中包含获取的 JWT 令牌。这将确保对受保护 API 路由的后续请求都携带 JWT 令牌。

验证登录状态

为了限制对特定页面或组件的访问,可以在组件的 fetch 钩子中或使用 useFetch composable 来验证登录状态。如果用户未登录,则将他们重定向到登录页面或显示错误消息。

代码示例

下面提供了一个示例登录组件,用于发送登录请求并提取 JWT 令牌:

<template>
  <form @submit.prevent="login">
    <input v-model="email" type="email" placeholder="Email" />
    <input v-model="password" type="password" placeholder="Password" />
    <button type="submit">Login</button>
  </form>
</template>

<script>
import { ref } from 'vue'
import { useFetch } from 'nuxt/fetch'

export default {
  setup() {
    const email = ref('')
    const password = ref('')
    const { fetch } = useFetch()

    const login = async () => {
      try {
        const res = await fetch('/api/login', {
          method: 'POST',
          body: {
            email: email.value,
            password: password.value,
          },
        })

        // 提取 JWT 令牌和用户数据
        // ...

        // 设置全局 JWT 令牌
        // ...

        // 重定向到主页
        // ...
      } catch (err) {
        // 处理登录失败
        // ...
      }
    }

    return { email, password, login }
  },
}
</script>

在需要验证登录状态的页面组件中,可以使用以下代码:

<template>
  <div v-if="isAuthenticated">
    <h1>Welcome, {{ user.name }}</h1>
  </div>
  <div v-else>
    <p>You are not logged in.</p>
  </div>
</template>

<script>
import { definePageMeta } from 'nuxt/composables'
import { useFetch } from 'nuxt/fetch'

export default {
  setup() {
    const { fetch } = useFetch()
    const isAuthenticated = ref(false)
    const user = ref({})

    const fetchUser = async () => {
      try {
        const res = await fetch('/api/user')

        // 检查用户是否已登录并更新状态
        // ...

      } catch (err) {
        // 处理获取用户失败
        // ...
      }
    }

    // 在页面加载时获取用户
    fetchUser()

    return { isAuthenticated, user }
  },

  meta: definePageMeta({
    middleware: 'auth' // 仅当用户已登录时才渲染页面
  })
}
</script>

安全注意事项

安全存储 JWT 令牌和用户数据至关重要。考虑使用 HTTP-only cookie 或本地存储,并限制对受保护 API 路由的访问。

结论

通过遵循这些步骤,你可以轻松地在 Nuxt 3 中实现基于 JWT 的身份验证。通过电子邮件和密码登录只是身份验证的众多可能性之一,你可以根据需要轻松扩展此系统。

常见问题解答

  1. JWT 令牌存储在哪里?
    JWT 令牌通常存储在 HTTP-only cookie 或本地存储中。

  2. 如何验证 JWT 令牌?
    验证 JWT 令牌涉及解码令牌并检查其签名和过期时间。

  3. 如何刷新 JWT 令牌?
    可以通过向 API 发送刷新令牌请求来刷新 JWT 令牌。

  4. 什么是跨站请求伪造(CSRF)保护?
    CSRF 保护措施防止攻击者冒充已登录用户执行操作。

  5. 如何防止暴力破解攻击?
    可以通过实施速率限制、验证码和其他措施来防止暴力破解攻击。