Français
Commencer

← Tous les templates · Mots de passe et connexion

Déployez FusionAuth en un clic

La gestion des identités et des accès clients : connexion, inscription, authentification unique (SSO) et MFA pour vos applications

Une alternative auto-hébergée à Auth0, Okta et Amazon Cognito.

Qu’est-ce que FusionAuth ?

FusionAuth est un serveur de gestion des identités et des accès clients (CIAM) : vos applications web, mobiles et API lui confient la connexion, l’inscription et la gestion des utilisateurs. Il parle OAuth 2.0, OpenID Connect et SAML 2.0, si bien que la plupart des frameworks s’y connectent avec leurs bibliothèques standard, et il a ses propres bibliothèques clientes pour JavaScript, Python, Java, Go, PHP, .NET, Ruby et d’autres. Ses pages de connexion hébergées connectent les gens avec un mot de passe, un lien magique ou un compte social comme Google, Apple ou Facebook, ajoutent l’authentification à deux facteurs avec une application d’authentification, et se personnalisent par des thèmes pour ressembler à votre application.

FusionAuth est édité par FusionAuth, Inc., à Denver, et son offre Community est gratuite, sans limite d’utilisateurs ; les offres payantes ajoutent des fonctionnalités comme les codes par e-mail et SMS, la détection des mots de passe compromis, les formulaires d’inscription personnalisés et SCIM. Il n’est pas open source : vous le faites tourner sous la licence de FusionAuth. Tout se trouve dans une seule interface d’administration et une API REST : applications, tenants pour des bases d’utilisateurs séparées, rôles, groupes, webhooks, réglages JWT et lambdas qui façonnent les tokens.

Ce template fait tourner l’image officielle de FusionAuth, version 1.69.4, avec une base de données Postgres 18 que Nouveau projet crée à côté, ou l’une des vôtres que vous choisissez, et cherche les utilisateurs dans Postgres, sans Elasticsearch. FusionAuth démarre d’abord sur un port que personne n’atteint, où son administrateur est créé à partir de l’e-mail et du mot de passe que vous saisissez : son assistant de configuration n’est donc jamais ouvert à un inconnu. Ses e-mails passent par Resend, SendGrid ou Amazon SES, celui que vous choisissez dans Nouveau projet, et il n’en envoie aucun tant que vous n’avez pas défini de fournisseur sur le tenant.

Hébergement de FusionAuth sur Pethost

  1. Vous vous connectez à Pethost avec une clé d’accès, GitHub ou Google. Pas encore de machine ? Vous choisissez une offre, et le lien attend qu’elle soit prête.
  2. Nouveau projet s’ouvre sur FusionAuth. Vous remplissez ce qu’il demande et cliquez sur Créer le projet : E-mail, Mot de passe administrateur.
  3. L’e-mail est facultatif : pour que l’application FusionAuth en envoie, vous choisissez Resend, SendGrid ou Amazon SES dans Nouveau projet et collez ce que le fournisseur vous donne.
  4. Nouveau projet crée aussi une nouvelle base de données pour FusionAuth et la connecte à l’application avant son premier démarrage : Postgres (512 MB). Ou vous choisissez une de vos bases de données Postgres : l’application FusionAuth y reçoit son propre utilisateur et sa propre base de données, que les autres applications n’ont pas le droit de lire, et toutes les applications de cette base sont sauvegardées et restaurées ensemble.
  5. En une minute ou deux, FusionAuth tourne à sa propre adresse en HTTPS. Ses secrets sont créés au hasard, et ses données sont dans la sauvegarde nocturne.
  6. C’est un projet comme les autres : vous ou votre agent pouvez le modifier, revenir à une version précédente ou le restaurer.

Questions sur FusionAuth

FusionAuth est-il gratuit ?

L’offre Community de FusionAuth est gratuite en auto-hébergement, sans limite d’utilisateurs et avec les fonctionnalités essentielles : OAuth 2.0, OpenID Connect et SAML, connexion sociale, MFA par application d’authentification, thèmes et l’API complète. Les offres payantes ajoutent les codes par e-mail et SMS, la détection des mots de passe compromis, les formulaires d’inscription personnalisés, SCIM et la détection des menaces. FusionAuth est gratuit à l’usage, mais pas open source.

FusionAuth ou Auth0 : lequel choisir ?

Les deux connectent les utilisateurs en OAuth 2.0, OpenID Connect et SAML, avec connexion sociale et MFA. Auth0 est un service cloud facturé au nombre d’utilisateurs actifs par mois ; l’offre Community de FusionAuth tourne là où vous l’hébergez, gratuitement quel que soit le nombre d’utilisateurs, et ses données restent dans votre base de données.

Comment ajouter la connexion à mon application avec FusionAuth ?

Créez une application dans l’interface d’administration de FusionAuth et ajoutez l’adresse de callback de votre application comme URL de redirection autorisée. Votre application envoie ensuite les utilisateurs vers la page de connexion hébergée de FusionAuth avec une bibliothèque OpenID Connect, avec l’ID client et le secret de l’application, et reçoit leurs tokens en retour.

FusionAuth prend-il en charge la connexion sociale et les clés d’accès ?

Oui. Dans l’offre Community, la section Identity Providers ajoute à la page de connexion Google, Apple, Facebook, Twitter et tout fournisseur OpenID Connect ou SAML 2.0. Les clés d’accès (WebAuthn) demandent une offre Licensed Community gratuite, enregistrée sur le portail de compte de FusionAuth.

FusionAuth peut-il migrer des utilisateurs depuis Auth0 ou Firebase ?

Oui. La User Import API accepte les hachages de mots de passe existants, si bien que les utilisateurs gardent leur mot de passe, et FusionAuth documente les migrations depuis Auth0, Amazon Cognito, Firebase, Keycloak et d’autres.

De combien de mémoire et de disque FusionAuth a-t-il besoin ?

FusionAuth tourne sur Java : environ 600–800 MB de mémoire au repos, à côté de sa base Postgres de 512 MB, davantage avec beaucoup d’utilisateurs et de connexions ; sa base de données grossit lentement, avec les utilisateurs et l’historique de leurs connexions. Nouveau projet donne à chaque base de données de l’application la mémoire que recommande le template, sauf si vous la changez : Postgres (512 MB). Sur Pethost, l’offre Starter lui suffit, avec de la place pour d’autres applications à côté.

Le fichier Docker Compose de FusionAuth

Le template, c’est ce compose.yaml et les variables écrites dans le .env du projet à sa création. Pethost exécute le fichier tel qu’il est écrit. La machine y écrit les identifiants de l’application pour ses bases de données, au moment où elle les connecte. Nouveau projet y écrit les réglages d’e-mail choisis, ou les laisse vides quand l’application n’envoie pas d’e-mail.

Conteneurs : fusionauth (fusionauth/fusionauth-app:1.69.4).

Bases de données, chacune un projet à part : Postgres (512 MB).

services:
  fusionauth:
    image: fusionauth/fusionauth-app:1.69.4
    restart: unless-stopped
    environment:
      # FusionAuth reads DATABASE_URL as a JDBC URL, so it is made here from the part's parts.
      DATABASE_URL: jdbc:postgresql://${DATABASE_HOST:?reload New project to link a Postgres database, or send link_databases with env_prefix DATABASE}:${DATABASE_PORT:?reload New project to link a Postgres database, or send link_databases with env_prefix DATABASE}/${DATABASE_NAME:?reload New project to link a Postgres database, or send link_databases with env_prefix DATABASE}
      DATABASE_USERNAME: ${DATABASE_USER:?reload New project to link a Postgres database, or send link_databases with env_prefix DATABASE}
      DATABASE_PASSWORD: ${DATABASE_PASSWORD:?reload New project to link a Postgres database, or send link_databases with env_prefix DATABASE}
      # Silent mode makes the schema in the linked database, which the app's user owns, and
      # applies a new release's migrations at its start; production mode never shows the
      # migration screen to a visitor.
      FUSIONAUTH_APP_SILENT_MODE: "true"
      FUSIONAUTH_APP_RUNTIME_MODE: production
      # Users are searched in Postgres, with no Elasticsearch or OpenSearch beside it.
      SEARCH_TYPE: database
      FUSIONAUTH_APP_MEMORY: 512M
      # 20 connections at most, FusionAuth's default, within the 47 of the Postgres part.
      DATABASE_MAXIMUM_POOL_SIZE: "20"
      URL: ${URL}
      ADMIN_EMAIL: ${ADMIN_EMAIL}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      SETUP_API_KEY: ${SETUP_API_KEY}
      # The mail provider picked in New project, by STARTTLS on its port; with none, FusionAuth
      # sends no mail until one is set on the tenant.
      SMTP_HOST: ${SMTP_HOST}
      SMTP_PORT: ${SMTP_PORT}
      SMTP_USER: ${SMTP_USER}
      SMTP_PASSWORD: ${SMTP_PASSWORD}
      SMTP_FROM: ${SMTP_FROM}
      SMTP_FROM_NAME: ${SMTP_FROM_NAME}
    # A new FusionAuth shows its setup wizard to whoever opens it first, also in the seconds
    # before Kickstart has run, and counts the setup as done only when Kickstart made the
    # administrator. So FusionAuth runs first on port 9019, which nobody reaches, and only then on
    # port 9011, the page's. On a new database, Kickstart makes the set-up's API key and the
    # administrator, with a stand-in email and password, and gives the default tenant the
    # project's address as its issuer; the API then gives the administrator the email and
    # password of the fields, and the tenant the mail provider, since Kickstart takes a quote or
    # a backslash out of what it is given. The set-up's key is deleted last: while it answers,
    # the set-up is unfinished, and once it is refused and the setup wizard sends a visitor to
    # sign in, FusionAuth is set up.
    command:
      - bash
      - -c
      - |
        set -e
        cd /usr/local/fusionauth
        json() { printf '%s' "$$1" | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g'; }
        # The set-up's API key, and the ids of it and of the administrator, all from SETUP_API_KEY.
        key=$$SETUP_API_KEY
        key_id=$${key:0:8}-$${key:8:4}-$${key:12:4}-$${key:16:4}-$${key:20:12}
        admin_id=$${key:32:8}-$${key:40:4}-$${key:44:4}-$${key:48:4}-$${key:52:12}

        # Kickstart runs only on a FusionAuth with no API key and no user yet.
        cat > /tmp/kickstart.json <<KICKSTART
        {
          "apiKeys": [{"id": "$$key_id", "key": "$$key", "keyManager": true, "description": "The template's set-up"}],
          "requests": [
            {"method": "PATCH", "url": "/api/tenant/#{FUSIONAUTH_TENANT_ID}", "body": {"tenant": {"issuer": "$$URL"}}},
            {
              "method": "POST",
              "url": "/api/user/registration/$$admin_id",
              "body": {
                "user": {"email": "[email protected]", "password": "$$key"},
                "registration": {"applicationId": "#{FUSIONAUTH_APPLICATION_ID}", "roles": ["admin"]}
              }
            }
          ]
        }
        KICKSTART
        FUSIONAUTH_APP_HTTP_PORT=9019 FUSIONAUTH_APP_KICKSTART_FILE=/tmp/kickstart.json fusionauth-app/bin/start.sh &
        first=$$!
        stop_first() {
          kill $$first
          wait $$first 2> /dev/null || true
        }
        api() {
          method=$$1
          path=$$2
          shift 2
          curl -sS -o /tmp/api.json -w '%{http_code}' -X "$$method" -H "Authorization: $$key" \
            -H 'Content-Type: application/json' "$$@" "http://127.0.0.1:9019$$path" 2> /dev/null || true
        }
        refused() {
          echo "FusionAuth refused $$1: $$(cat /tmp/api.json)" >&2
          stop_first
          exit 1
        }

        # Silent mode migrates the database first; a database that does not answer stops the
        # start after 5 minutes, and the next start tries again.
        for wait in $$(seq 300); do
          kill -0 $$first 2> /dev/null || { echo "FusionAuth stopped at its first start." >&2; exit 1; }
          admin=$$(api GET "/api/user/$$admin_id")
          [ "$$admin" = 200 ] && break
          wizard=$$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:9019/admin/setup-wizard || true)
          [ "$$admin" = 401 ] && [ "$$wizard" = 302 ] && break
          sleep 1
        done
        if [ "$$admin" != 200 ] && [ "$$wizard" != 302 ]; then
          echo "FusionAuth did not answer on its first start within 5 minutes." >&2
          stop_first
          exit 1
        fi

        if [ "$$admin" = 200 ]; then
          echo "setting FusionAuth up on a port nobody reaches"
          tenant=$$(grep -o '"tenantId":"[^"]*"' /tmp/api.json | head -n 1 | cut -d '"' -f 4)
          if [ "$${#ADMIN_PASSWORD}" -lt 8 ]; then
            echo "The admin password has fewer than 8 characters, which FusionAuth refuses: give one of 8 or more in ADMIN_PASSWORD of the project's .env, then deploy again." >&2
            stop_first
            exit 1
          fi
          [ "$$(api PATCH "/api/user/$$admin_id" \
            -d "{\"user\": {\"email\": \"$$(json "$$ADMIN_EMAIL")\", \"password\": \"$$(json "$$ADMIN_PASSWORD")\"}}")" = 200 ] \
            || refused "the administrator's email and password"
          if [ -n "$$SMTP_HOST" ]; then
            [ "$$(api PATCH "/api/tenant/$$tenant" -d "{\"tenant\": {\"emailConfiguration\": {\"host\": \"$$(json "$$SMTP_HOST")\",
              \"port\": $$SMTP_PORT, \"security\": \"TLS\", \"username\": \"$$(json "$$SMTP_USER")\", \"password\": \"$$(json "$$SMTP_PASSWORD")\",
              \"defaultFromEmail\": \"$$(json "$$SMTP_FROM")\", \"defaultFromName\": \"$$(json "$$SMTP_FROM_NAME")\"}}}")" = 200 ] \
              || refused "the mail provider"
          fi
          # The set-up's API key can do anything, and nothing needs it any more.
          [ "$$(api DELETE "/api/api-key/$$key_id")" = 200 ] || refused "to delete the set-up's API key"
          echo "FusionAuth is set up, with the administrator $$ADMIN_EMAIL"
        fi
        stop_first
        rm /tmp/kickstart.json

        exec fusionauth-app/bin/start.sh
    healthcheck:
      test: ["CMD", "curl", "-fsS", "-o", "/dev/null", "http://127.0.0.1:9011/api/status"]
      interval: 10s
      timeout: 5s
      retries: 30
      start_period: 300s

Aussi dans Mots de passe et connexion