Gérer Auth0 avec Terraform : configuration as code complète
Le provider Terraform Auth0 permet de gérer tout votre tenant en code versionné : applications, connexions, rôles, actions et email templates.
Par Auth0.Expert · 2025-03-18 · 11 min de lecture
Auth0 avec Terraform : guide complet
TL;DR
Le provider Terraform auth0/auth0 permet de gérer votre tenant Auth0 entièrement en code. Versionnez votre configuration IAM, automatisez les déploiements et détectez les drifts.
---
Setup : provider Auth0
Ce premier bloc montre comment initialiser le provider Terraform Auth0, pour permettre à Terraform d'interagir avec votre tenant Auth0 de façon sécurisée.
# providers.tf
terraform {
required_providers {
auth0 = {
source = "auth0/auth0"
version = "~> 1.0"
}
}
}
provider "auth0" {
domain = var.auth0_domain
client_id = var.auth0_client_id
client_secret = var.auth0_client_secret
}
# Variables
variable "auth0_domain" { type = string }
variable "auth0_client_id" { type = string }
variable "auth0_client_secret" {
type = string
sensitive = true
}
---
Application (SPA)
Cette ressource configure une application SPA dans Auth0. Elle définit ses callbacks, ses origines, ses types de tokens autorisés et la politique de rotation des refresh tokens pour renforcer la sécurité.
# applications.tf
resource "auth0_client" "spa_app" {
name = "YourApp Frontend"
app_type = "spa"
oidc_conformant = true
callbacks = [
"https://yourapp.com/callback",
"http://localhost:3000/callback",
]
allowed_logout_urls = [
"https://yourapp.com",
"http://localhost:3000",
]
web_origins = [
"https://yourapp.com",
"http://localhost:3000",
]
grant_types = ["authorization_code", "refresh_token"]
jwt_configuration {
alg = "RS256"
}
refresh_token {
rotation_type = "rotating"
expiration_type = "expiring"
token_lifetime = 2592000 # 30 jours
idle_token_lifetime = 1296000 # 15 jours
leeway = 3
infinite_idle_token_lifetime = false
infinite_token_lifetime = false
}
}
Ce bloc crée une application front-end sécurisée avec gestion avancée des refresh tokens et OIDC.
---
Resource Server (API)
Cette ressource définit un "Resource Server", c’est-à-dire l’API à protéger avec Auth0. Elle configure la durée de vie des tokens, la gestion des scopes et l’algorithme de signature.
resource "auth0_resource_server" "main_api" {
name = "Main API"
identifier = "https://api.yourapp.com"
signing_alg = "RS256"
token_lifetime = 86400
skip_consent_for_verifiable_first_party_clients = true
enforce_policies = true
token_dialect = "access_token_authz"
scopes {
value = "read:posts"
description = "Lire les articles"
}
scopes {
value = "write:posts"
description = "Créer et modifier des articles"
}
scopes {
value = "delete:posts"
description = "Supprimer des articles"
}
scopes {
value = "admin:all"
description = "Accès administrateur complet"
}
}
Ce code configure les permissions de votre API pour une gestion fine de l'accès selon les scopes.
---
Connexion sociale (Google)
Ici, nous intégrons une connexion Google OAuth2 et une connexion classique email/mot de passe pour permettre différents modes d'authentification à l’application.
resource "auth0_connection" "google" {
name = "google-oauth2"
strategy = "google-oauth2"
options {
client_id = var.google_client_id
client_secret = var.google_client_secret
scopes = ["email", "profile"]
set_user_root_attributes = "on_each_login"
}
enabled_clients = [auth0_client.spa_app.client_id]
}
resource "auth0_connection" "email_password" {
name = "Username-Password-Authentication"
strategy = "auth0"
options {
password_policy = "excellent"
password_history {
enable = true
size = 5
}
password_no_personal_info { enable = true }
password_dictionary { enable = true }
brute_force_protection = true
requires_username = false
}
enabled_clients = [auth0_client.spa_app.client_id]
}
Ce bloc offre l’accès par Google ou par email avec une sécurité renforcée côté mot de passe.
---
Rôles et permissions
Cette section gère les rôles (RBAC) et leurs permissions associées, pour contrôler finement qui peut accéder à quelles ressources sur l’API.
resource "auth0_role" "admin" {
name = "admin"
description = "Administrateur complet"
}
resource "auth0_role" "editor" {
name = "editor"
description = "Peut lire et écrire des articles"
}
resource "auth0_role_permissions" "editor_permissions" {
role_id = auth0_role.editor.id
permissions {
resource_server_identifier = auth0_resource_server.main_api.identifier
name = "read:posts"
}
permissions {
resource_server_identifier = auth0_resource_server.main_api.identifier
name = "write:posts"
}
}
Ce code définit des rôles et leurs droits, pour une gestion des accès personnalisée sur votre API.
---
Action Post Login
Cette ressource déploie une Action Auth0 déclenchée après login, pour enrichir le token ou effectuer des appels externes grâce à des secrets et des dépendances.
resource "auth0_action" "post_login_enrich" {
name = "Post Login - Enrich Token"
runtime = "node18"
deploy = true
code = file("${path.module}/actions/post_login_enrich.js")
supported_triggers {
id = "post-login"
version = "v3"
}
dependencies {
name = "axios"
version = "1.6.7"
}
secrets {
name = "STRIPE_SECRET_KEY"
value = var.stripe_secret_key
}
}
resource "auth0_trigger_actions" "post_login" {
trigger = "post-login"
actions {
id = auth0_action.post_login_enrich.id
display_name = auth0_action.post_login_enrich.name
}
}
Cette configuration automatise un enrichissement des tokens après authentification, avec accès à des secrets et des librairies externes.
---
Multi-environnements avec Terraform Workspaces
Cette section montre comment gérer plusieurs environnements (dev, staging, prod) avec Terraform workspaces pour isoler vos configurations Auth0.
# Structure des workspaces
terraform workspace new dev
terraform workspace new staging
terraform workspace new prod
# Variables par workspace (terraform.tfvars)
# dev.tfvars
auth0_domain = "myapp-dev.eu.auth0.com"
# prod.tfvars
auth0_domain = "myapp.eu.auth0.com"
Ce bloc permet d’adapter les variables selon l’environnement cible.
# Conditional selon l'environnement
locals {
env = terraform.workspace
is_prod = local.env == "prod"
}
resource "auth0_client" "spa_app" {
callbacks = local.is_prod
? ["https://yourapp.com/callback"]
: ["http://localhost:3000/callback", "https://${local.env}.yourapp.com/callback"]
}
Grâce à cette logique conditionnelle, vous pouvez personnaliser vos endpoints selon l'environnement.
---
Import de la configuration existante
Cette partie explique comment importer des ressources Auth0 déjà existantes dans votre état Terraform, pour unifier la gestion infrastructure-as-code.
# Importer un client Auth0 existant dans Terraform
terraform import auth0_client.spa_app CLIENT_ID
# Importer une connexion existante
terraform import auth0_connection.google CONNECTION_ID
# Générer la config depuis l'existant
terraform plan -generate-config-out=generated.tf
Importer vos configurations existantes accélère la migration vers une gestion centralisée IAM avec Terraform.
---
> 🔧 Migration Auth0 vers Terraform : nous importons votre configuration Auth0 existante dans Terraform et mettons en place un pipeline CI/CD pour tous vos tenants.
Autres articles
- Auth0 et OAuth 2.0 : architecture complète pour comprendre les flux d'autorisation
- OpenID Connect sur Auth0 : ID Token, UserInfo et discovery endpoint expliqués
- Configurer SAML 2.0 avec Auth0 : guide complet pour l'entreprise
- Migrer des Rules vers les Auth0 Actions : guide pas à pas
- Architecture multi-tenant avec Auth0 : organisations, isolation et bonnes pratiques
- Validation des JWT Auth0 : RS256 vs HS256, JWKS et pièges communs
- Concevoir son architecture de tenants Auth0 : dev, staging, prod
- Configurer un domaine personnalisé Auth0 : login.votredomaine.com étape par étape