Saltar al contenido principal

Usa IA para integrar Auth0

Si usas un asistente de programación con IA como Claude Code, Cursor o GitHub Copilot, puedes añadir la autenticación de Auth0 automáticamente en minutos con agent skills.Instala:
npx skills add auth0/agent-skills --skill auth0-quickstart --skill auth0-vue
Luego, pídele a tu asistente de IA:
Add Auth0 authentication to my Vue app
Tu asistente de IA creará automáticamente tu aplicación de Auth0, recuperará las credenciales, instalará @auth0/auth0-vue, creará el plugin de autenticación y configurará tus rutas. Documentación completa sobre agent skills →
Requisitos previos: Antes de comenzar, asegúrate de tener instalados los siguientes elementos:Verifica la instalación: node --version && npm --versionCompatibilidad de versiones de Vue: Esta guía de inicio rápido funciona con Vue 3.x y versiones posteriores.

Primeros pasos

En esta guía de inicio rápido se muestra cómo integrar la autenticación de Auth0 en una aplicación de Vue.js 3. Crearás una aplicación de página única adaptable con autenticación segura de usuario mediante la API de composición de Vue y el SDK de Auth0 para Vue.
1

Crear un nuevo proyecto

Crea un nuevo proyecto de Vue 3 para esta guía de inicio rápido
npm create vue@latest auth0-vue -- --typescript --router --pinia
Abre el proyecto
cd auth0-vue
2

Instala el SDK de Auth0 para Vue

npm add @auth0/auth0-vue && npm install
3

Configura tu aplicación de Auth0

A continuación, debes crear una nueva aplicación en tu inquilino de Auth0 y agregar las variables de entorno a tu proyecto.Tienes tres opciones para configurar tu aplicación de Auth0: usar la herramienta de configuración rápida (recomendado), ejecutar un comando de la CLI o configurarla manualmente desde el Dashboard:
Crea una aplicación de Auth0 y copia el archivo .env rellenado previamente con los valores de configuración correctos.
Verifica que el archivo .env exista: cat .env (Mac/Linux) o type .env (Windows)
4

Configura el plugin de Auth0

src/main.ts
import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import router from './router'
import { createAuth0 } from '@auth0/auth0-vue'

import App from './App.vue'

const app = createApp(App)

app.use(createAuth0({
  domain: import.meta.env.VITE_AUTH0_DOMAIN,
  clientId: import.meta.env.VITE_AUTH0_CLIENT_ID,
  authorizationParams: {
    redirect_uri: window.location.origin
  }
}))

app.use(createPinia())
app.use(router)

app.mount('#app')
5

Crear componentes de autenticación

Crear archivos de componentes
touch src/components/LoginButton.vue && touch src/components/LogoutButton.vue && touch src/components/UserProfile.vue
Y agrega los siguientes fragmentos de código
6

Ejecuta la aplicación

npm run dev
Si el puerto 5173 está en uso, ejecuta: npm run dev -- --port 5174 y actualiza las URL de devolución de llamada de tu aplicación de Auth0 a http://localhost:5174
Punto de controlAhora deberías tener una página de inicio de sesión de Auth0 completamente funcional ejecutándose en tu localhost

Uso avanzado

Usa las guardas de navegación de Vue Router para proteger rutas específicas:
src/router/index.ts
import { createRouter, createWebHistory } from 'vue-router'
import { authGuard } from '@auth0/auth0-vue'
import Home from '../views/Home.vue'
import Profile from '../views/Profile.vue'
import Dashboard from '../views/Dashboard.vue'

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/profile',
    name: 'Profile',
    component: Profile,
    beforeEnter: authGuard
  },
  {
    path: '/dashboard',
    name: 'Dashboard',
    component: Dashboard,
    beforeEnter: authGuard
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router
Configura tu plugin de Auth0 para incluir la audiencia de una API y realizar solicitudes autenticadas:
src/main.ts
import { createAuth0 } from '@auth0/auth0-vue'

const app = createApp(App)

app.use(
  createAuth0({
    domain: import.meta.env.VITE_AUTH0_DOMAIN,
    clientId: import.meta.env.VITE_AUTH0_CLIENT_ID,
    authorizationParams: {
      redirect_uri: window.location.origin,
      audience: "YOUR_API_IDENTIFIER"
    }
  })
)
Luego, realiza llamadas autenticadas a la API en tus componentes:
src/components/ApiCall.vue
<template>
  <div>
    <button @click="callProtectedApi" :disabled="isLoading">
      Llamar a la API protegida
    </button>
    <pre v-if="apiResponse">{{ JSON.stringify(apiResponse, null, 2) }}</pre>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { useAuth0 } from '@auth0/auth0-vue'

const { getAccessTokenSilently } = useAuth0()
const apiResponse = ref(null)
const isLoading = ref(false)

const callProtectedApi = async () => {
  try {
    isLoading.value = true
    const token = await getAccessTokenSilently()
    
    const response = await fetch('/api/protected', {
      headers: {
        Authorization: `Bearer ${token}`
      }
    })
    
    apiResponse.value = await response.json()
  } catch (error) {
    console.error('La llamada a la API falló:', error)
  } finally {
    isLoading.value = false
  }
}
</script>
Crea composables reutilizables para patrones de autenticación comunes:
src/composables/useAuthenticatedUser.ts
import { computed, ref, watchEffect } from 'vue'
import { useAuth0 } from '@auth0/auth0-vue'

export function useAuthenticatedUser() {
  const { user, isAuthenticated, isLoading, getAccessTokenSilently } = useAuth0()
  const accessToken = ref<string | null>(null)

  watchEffect(async () => {
    if (isAuthenticated.value && !isLoading.value) {
      try {
        accessToken.value = await getAccessTokenSilently()
      } catch (error) {
        console.error('No se pudo obtener el token de acceso:', error)
      }
    }
  })

  return {
    user: computed(() => user.value),
    accessToken: computed(() => accessToken.value),
    isAuthenticated: computed(() => isAuthenticated.value),
    isLoading: computed(() => isLoading.value)
  }
}
Uso en componentes:
src/components/UserDashboard.vue
<template>
  <div v-if="!isLoading">
    <h1>Te damos la bienvenida, {{ user?.name }}</h1>
    <p>Token de acceso: {{ accessToken ? 'Disponible' : 'No disponible' }}</p>
  </div>
  <div v-else>Cargando...</div>
</template>

<script setup lang="ts">
import { useAuthenticatedUser } from '../composables/useAuthenticatedUser'

const { user, accessToken, isLoading } = useAuthenticatedUser()
</script>