{
  "startNodeId": "saisie",
  "steps": {
    "saisie": {
      "type": "PageNode",
      "nodes": [
        {
          "type": "UsernameCollectorNode",
          "layout": {
            "name": "Identifiant"
          }
        },
        {
          "type": "PasswordCollectorNode",
          "layout": {
            "name": "Mot de passe"
          }
        }
      ],
      "outcomes": {
        "outcome": "annuaire"
      },
      "layout": {
        "x": 40,
        "y": 220,
        "name": "Identifiant et mot de passe"
      },
      "stage": "PageNode"
    },
    "annuaire": {
      "type": "DataStoreNode",
      "config": {
        "authLevel": 0
      },
      "outcomes": {
        "true": "enrole",
        "false": "echec"
      },
      "layout": {
        "x": 360,
        "y": 230,
        "name": "Vérification du mot de passe"
      },
      "stage": "DataStoreNode"
    },
    "enrole": {
      "type": "MfaEnrollmentCheckNode",
      "config": {
        "methodsToCheck": "totp"
      },
      "outcomes": {
        "enrolled": "totp",
        "notEnrolled": "secret"
      },
      "layout": {
        "x": 680,
        "y": 230,
        "name": "Déjà enrôlé ?"
      },
      "stage": "MfaEnrollmentCheckNode"
    },
    "secret": {
      "type": "TotpSecretGeneratorNode",
      "config": {
        "issuer": "TOSIAM"
      },
      "outcomes": {
        "outcome": "qrcode"
      },
      "layout": {
        "x": 1000,
        "y": 420,
        "name": "Génération du secret"
      },
      "stage": "TotpSecretGeneratorNode"
    },
    "qrcode": {
      "type": "TotpQrCodeDisplayNode",
      "outcomes": {
        "outcome": "confirmation"
      },
      "layout": {
        "x": 1320,
        "y": 420,
        "name": "QR code"
      },
      "stage": "TotpQrCodeDisplayNode"
    },
    "confirmation": {
      "type": "TotpVerifierNode",
      "config": {
        "secretSource": "sharedState"
      },
      "outcomes": {
        "true": "enregistrement",
        "false": "confirmation",
        "exceeded": "echec"
      },
      "layout": {
        "x": 1640,
        "y": 420,
        "name": "Code de confirmation"
      },
      "stage": "TotpVerifierNode"
    },
    "enregistrement": {
      "type": "TotpEnrollCommitNode",
      "outcomes": {
        "outcome": "codes"
      },
      "layout": {
        "x": 1960,
        "y": 420,
        "name": "Enregistrement du secret"
      },
      "stage": "TotpEnrollCommitNode"
    },
    "codes": {
      "type": "TotpRecoveryCodesDisplayNode",
      "outcomes": {
        "outcome": "succes"
      },
      "layout": {
        "x": 2280,
        "y": 420,
        "name": "Codes de récupération"
      },
      "stage": "TotpRecoveryCodesDisplayNode"
    },
    "totp": {
      "type": "TotpVerifierNode",
      "outcomes": {
        "true": "succes",
        "false": "totp",
        "exceeded": "recuperation"
      },
      "layout": {
        "x": 1000,
        "y": 60,
        "name": "Code TOTP"
      },
      "stage": "TotpVerifierNode"
    },
    "recuperation": {
      "type": "RecoveryCodeVerifyNode",
      "outcomes": {
        "true": "succes",
        "false": "echec",
        "consumed": "echec"
      },
      "layout": {
        "x": 1320,
        "y": 40,
        "name": "Code de récupération"
      },
      "stage": "RecoveryCodeVerifyNode"
    },
    "succes": {
      "type": "SuccessNode",
      "layout": {
        "x": 2600,
        "y": 150,
        "name": "Succès"
      },
      "stage": "SuccessNode"
    },
    "echec": {
      "type": "FailureNode",
      "layout": {
        "x": 2600,
        "y": 620,
        "name": "Échec"
      },
      "stage": "FailureNode"
    }
  }
}