# Authentification

## Prérequis

* Assurez-vous d'avoir une copie de WorkflowGen sous licence installée et en fonctionnement sur un serveur. Vous devez être un administrateur WorkflowGen.
* Assurez-vous d'avoir l'accès d'administrateur à Auth0.
* Assurez-vous d'avoir approvisionné un utilisateur Auth0 existant depuis lequel vous pourrez vous authentifier à WorkflowGen et que cet utilisateur a les permissions d'accès d'administrateur. Ceci est important car une fois que vous aurez activé la délégation, vous devrez toujours pouvoir gérer l'application. L'utilisateur Auth0 est en fait un utilisateur d'un fournisseur d'identité qui est lié à Auth0, comme GitHub ou Google. Vous devez avoir approvisionné au moins un utilisateur.
* Le mode de chiffrement AES et sa clé sont requis pour que l'authentification fonctionne.

{% hint style="info" %}

* Pour tester la configuration après avoir suivi les étapes suivantes, vous pouvez ajouter un utilisateur Auth0 dans la section **Users** du portail Auth0.
* Lorsque vous importez des utilisateurs dans WorkflowGen depuis la base de données d'Auth0, assurez-vous de définir le nom d'utilisateur comme son adresse email (p.ex. `jean.tremblay@exemple.com`).
  {% endhint %}

## Configuration d'Auth0

La configuration d'Auth0 se fait dans plusieurs étapes. D'abord, vous devez inscrire l'application Web de WorkflowGen et la lier à votre instance de WorkflowGen; ensuite, vous devez inscrire l'API GraphQL de WorkflowGen pour pouvoir inscrire des applications personnalisées pour y accéder.

### Étape 1 : Créez une nouvelle application Web régulière

1. Naviguez à la section **Applications** dans le portail Auth0.<br>
2. Cliquez sur **Create Application** et renseignez le formulaire :
   * **Name** **:** `WorkflowGen Web App`&#x20;
   * **Type** **:** Regular Web Application<br>
3. Cliquez sur **Create**. Vous devriez maintenant voir la page « Quick Start » de l'application.<br>
4. Dans l'onglet **Settings**, défilez vers le bas jusqu'à la section **Allowed Callback URLs** et ajoutez-y `https://<workflowgen url>/auth/callback`.<br>
5. Défilez vers le bas jusqu'à la section **Allowed Logout URLs** et ajoutez-y `https://<workflowgen url>/auth/logout/return`.

Votre application Web régulière de WorkflowGen est maintenant configurée.

### Étape 2 : Inscrivez l'API GraphQL

Vous devez maintenant inscrire le module de l'API GraphQL de WorkflowGen afin que les applications externes à WorkflowGen puissent utiliser l'API avec l'authentification Auth0 en utilisant le protocole OpenID Connect.

#### **Utilisation classique :**

1. Accédez à la section **APIs** dans le portail Auth0.<br>
2. Cliquez sur **Create API** et renseignez le formulaire :
   * **Name** **:** `WorkflowGen GraphQL API`&#x20;
   * **Identifier** **:** `https://<workflowgen url>/graphql`&#x20;
   * **Signing algorithm** **:** `RS256` <br>
3. Cliquez sur **Create**.

#### **Avec support multi-audiences :**

1. Accédez à la section **APIs** dans le portail Auth0.<br>
2. Cliquez sur **Create API** et renseignez le formulaire :
   * **Name** **:** `My APIs`&#x20;
   * **Identifier** **:** `my-apis`
   * **Signing algorithm** **:** `RS256` <br>
3. Cliquez sur **Create**.<br>
4. Cliquez sur **Permissions**.<br>
5. Dans la section **Define all the permissions (scopes) that this API uses**, saisissez les informations suivantes :
   * **Permission:** `wfgen-graphql-full-access`
   * **Description:** `Full access to the WorkflowGen GraphQL API` <br>
6. Cliquez sur **ADD**.

L'API GraphQL est maintenant inscrite dans Auth0.

### Étape 3 : Ajoutez une action Auth0

Pour obtenir un bon nom d'utilisateur du jeton d'accès lors de sa réception dans l'API GraphQL, vous devez utilisez une fonctionnalité spéciale d'Auth0 appelée **action**. Les actions agissent en tant qu'intergiciels (« middleware ») entre le fournisseur cloud lié et Auth0 afin de récupérer les valeurs correctes au besoin.

1. Accédez au portail Auth0 et sélectionnez **Actions** dans le menu de gauche, puis sélectionnez **Library** dans le sous-menu.

2. Cliquez sur **Create Action**, puis choisissez le modèle **Build from scratch**.<br>

3. Donnez un nom à l'action (p.ex. `WorkflowGen (Action)`). **Trigger** doit être réglé sur **Login / Post Login** et **Runtime** doit être réglé sur **Node 18 (Recommended)**.\
   ![](https://content.gitbook.com/content/BFK0VdoJAflV4kfX3rTq/blobs/WpcDO9IvXWr1bBG1tjhe/create%20action.png)<br>

4. Remplacez le code par le code suivant :

   <pre><code><strong>exports.onExecutePostLogin = async (event, api) => {
   </strong>    const username = event.user.username || event.user.email || event.user.nickname;
              
       api.accessToken.setCustomClaim('https://api.workflowgen.com/username', username);
       api.idToken.setCustomClaim('https://api.workflowgen.com/username', username);

       return;
   }
   </code></pre>

5. Cliquez sur **Deploy**.<br>

6. Accédez au portail Auth0 et sélectionnez **Actions** dans le menu de gauche, puis sélectionnez **Flows** dans le sous-menu.<br>

7. Sur la page **Flows**, cliquez sur l'icône **Login**.<br>

8. Dans le panneau de droite de la vue graphique, sélectionnez l'onglet **Custom**, où votre action personnalisée doit apparaître.

   <figure><img src="https://content.gitbook.com/content/BFK0VdoJAflV4kfX3rTq/blobs/gZtTE7ydMWRWyTJd0trB/login%202.png" alt=""><figcaption></figcaption></figure>

9. Glissez-déplacez votre action entre les actions **Start** et **Complete**.

   <figure><img src="https://content.gitbook.com/content/BFK0VdoJAflV4kfX3rTq/blobs/GOb5b6lsaBJPlc2FHLPV/login%201.png" alt=""><figcaption></figcaption></figure>

10. Cliquez sur le bouton **Apply** en haut à droite.

Cette étape assurera que WorkflowGen et l'API GraphQL obtiendront toujours un nom d'utilisateur depuis la même revendication au lieu de devoir faire plusieurs instructions conditionnelles. Cependant, ceci ne s'applique pas à l'authentification de machine à machine car il n'y aucun utilisateur humain impliqué.

Si vous utilisez une revendication de la correspondance Auth0 autre que celle spécifiée dans la fonction ci-dessus (p.ex. `user.username`, `user.email`, `user.nickname`), il suffit tout simplement de modifier cette règle ou ajouter la vôtre. Assurez-vous d'alimenter `https://api.workflowgen.com/username` avec la valeur, ou de configurer l'option `ApplicationSecurityAuthUsernameClaim` dans votre `web.config` avec la bonne revendication à prendre. Notez que cette option est utilisée dans l'application d'authentification ainsi que dans l'API GraphQL.

## Configuration de WorkflowGen

Maintenant, vous devez configurez WorkflowGen pour déléguer son authentification à Auth0.

### Étape 1 : Ajoutez les valeurs Auth0 au `web.config` de WorkflowGen

1. Ouvrez le fichier `web.config` de WorkflowGen et ajoutez-y les propriétés suivantes sous `<appSettings>` :\
   \
   **Utilisation classique :**

   ```markup
    <!-- Auth0 auth -->
    <add key="ApplicationSecurityAuthProvider" value="auth0"/>
    <add key="ApplicationSecurityAuthClientId" value="<CLIENT ID>" />
    <add key="ApplicationSecurityAuthClientSecret" value="<CLIENT SECRET>" />
    <add key="ApplicationSecurityAuthMetadataUrl" value="<METADATA URL>" />
    <add key="ApplicationSecurityAuthUsernameClaim" value="https://api.workflowgen.com/username" />
    <add key="ApplicationSecurityAuthAppIdClaim" value="azp" />
    <add key="ApplicationSecurityAuthClockTolerance" value="60" />
    <add key="ApplicationSecurityAuthSessionRefreshEnableIFrame" value="Y"/>
   ```

   **Avec support multi-audiences :**

   ```markup
    <!-- Auth0 auth -->
    <add key="ApplicationSecurityAuthProvider" value="auth0"/>
    <add key="ApplicationSecurityAuthClientId" value="<CLIENT ID>" />
    <add key="ApplicationSecurityAuthClientSecret" value="<CLIENT SECRET>" />
    <add key="ApplicationSecurityAuthMetadataUrl" value="<METADATA URL>" />
    <add key="ApplicationSecurityAuthUsernameClaim" value="https://api.workflowgen.com/username" />
    <add key="ApplicationSecurityAuthAppIdClaim" value="azp" />
    <add key="ApplicationSecurityAuthClockTolerance" value="60" />
    <add key="ApplicationSecurityAuthSessionRefreshEnableIFrame" value="Y"/>
    <add key="ApplicationSecurityAuthAudience" value="my-apis"/>
    <add key="ApplicationSecurityAuthAdditionalScopes" value="wfgen-graphql-full-access"/>
    <add key="ApplicationSecurityAuthGraphScope" value="wfgen-graphql-full-access"/>
   ```
2. Remplacez `<CLIENT_ID>` par l'ID client de l'application Web régulière de WorkflowGen dans Auth0.<br>
3. Remplacez `<CLIENT SECRET>` par la clé secrète client de l'application Web régulière de WorkflowGen dans Auth0.<br>
4. Remplacez `<METADATA_URL>` par l'URL que vous avez construit antérieurement depuis votre nom de domaine dans Auth0.

Notez que la clé `ApplicationSecurityAuthUsernameClaim` est réglée sur la valeur saisie dans la règle antérieurement, donc vous pouvez utiliser n'importe quelle valeur ici à condition que vous modifiez aussi la règle.

{% hint style="info" %}
Pour des informations sur les options de configuration disponibles à utiliser avec votre instance, consultez l'annexe [Paramètres de configuration Web et d'application](https://docs.workflowgen.com/tech-fr/9.4/annexe-parametres-de-configuration-web-et-dapplication).
{% endhint %}

WorkflowGen est maintenant lié à Auth0 et réciproquement. La dernière étape est de configurer quelques options pour finaliser le « câblage interne ».

### Étape 2 : Ajoutez des valeurs de sécurité pour la génération de session

Pour générer un jeton de session, vous devez ajouter quelques configurations au fichier `web.config`.

1. Ouvrez le fichier `web.config` de WorkflowGen et ajouter la propriété suivante sous `<appSettings>` :

   ```markup
   <!-- Auth -->
   <add key="ApplicationSecurityAuthLogoutUrl" value="https://<your auth0 domain>.auth0.com/v2/logout"/>
   <add key="ApplicationSecurityAuthSessionTokenSigningSecret" value="<SECRET>" />
   ```
2. Remplacez `<SECRET>` par une valeur qui ne peut pas être devinée, comme un UUID.

Le secret sera seulement accessible dans votre instance de WorkflowGen, donc lors de la génération du jeton de session, WorkflowGen le signera avec ce secret afin de vérifier la validité de tous les jetons qui seront envoyés.

### Étape 3 : Activez la délégation d'authentification

Vous devez maintenant activer la délégation en remplaçant le système d'authentification dans IIS et faire pointer les modules de WorkflowGen au module d'authentification correct.

#### **Configurez IIS**

1. Dans IIS Manager, cliquez sur l'application WorkflowGen dans l'arborescence.<br>
2. Cliquez sur le bouton **Authentication**.<br>
3. Activez **Anonymous Authentication** et désactivez toutes les autres authentifications.<br>
4. Répétez ces étapes pour toutes les sous-applications.

#### **Ajoutez des propriétés aux fichiers `web.config` de certains modules**

Certains modules doivent faire vérifier leur authentification par le module d'authentification spécial de WorkflowGen `Advantys.Security.JWTAuthenticationModule`, tandis que certains autres modules ne le doivent pas parce qu'ils sont soit publics ou ne font pas partie du système d'authentification global.

1. Ajoutez la propriété suivante au fichier `web.config` de WorkflowGen :

   ```markup
   <?xml version="1.0" encoding="UTF-8"?>
   <configuration>
       <system.webServer>
           <modules>
               <add name="ApplicationSecurityAuthenticationModule" type="Advantys.Security.Http.JWTAuthenticationModule" />
           </modules>
       </system.webServer>
   </configuration>
   ```
2. Ajoutez la propriété suivante au fichier `web.config` du module `auth` :

   ```markup
   <?xml version="1.0" encoding="UTF-8"?>
   <configuration>
       <system.webServer>
           <modules>
               <remove name="ApplicationSecurityAuthenticationModule"/>
           </modules>
       </system.webServer>
   </configuration>
   ```

   Cette ligne enlève le module d'authentification Node.js du système d'authentification global, car cette application Node.js encapsule les mécanismes d'authentification de OpenID connect.<br>
3. Répétez les deux étapes ci-haut pour les modules `hooks` et `scim`.<br>
4. Copiez les assemblies et bibliothèques de dépendances .NET suivants de `\wfgen\bin` dans les dossiers `\bin` de tous les formulaires Web personnalisés (`\wfgen\wfapps\webforms\<custom webform>\bin`) :
   * `Advantys.My.dll`
   * `Advantys.Security.dll`
   * `Newtonsoft.Json.dll`
   * `jose-jwt.dll`

{% hint style="success" %}
Vous devriez maintenant avoir une instance de WorkflowGen en fonctionnement avec l'authentification déléguée à Auth0 via le protocole OpenID Connect. Assurez-vous d'avoir approvisionné vos utilisateurs à WorkflowGen afin qu'ils puissent accéder à WorkflowGen.
{% endhint %}

## Configurer l'authentification sans l'API GraphQL

{% hint style="warning" %}
Cette fonctionnalité n'est pas supportée pour Auth0. Il est nécessaire de configurer l'API GraphQL sur le fournisseur.
{% endhint %}
