> ## Documentation Index
> Fetch the complete documentation index at: https://www.ayrshare.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Vue d'ensemble de Generate JWT

> Générez une URL de liaison de réseau social pour un profil d'utilisateur.

export const PlansAvailable = ({plans = [], maxPackRequired}) => {
  let displayPlans = plans;
  if (plans && plans.length === 1) {
    const lowerCasePlan = plans[0].toLowerCase();
    if (lowerCasePlan === "business") {
      displayPlans = ["Launch", "Business", "Enterprise"];
    } else if (lowerCasePlan === "premium") {
      displayPlans = ["Premium", "Launch", "Business", "Enterprise"];
    }
  }
  return <Note>
Available on {displayPlans.length === 1 ? "the " : ""}
{displayPlans.join(", ").replace(/\b\w/g, l => l.toUpperCase())}{" "}
{displayPlans.length > 1 ? "plans" : "plan"}.

{maxPackRequired && <span onClick={() => window.open('https://www.ayrshare.com/docs/additional/maxpack', '_self')} className="flex items-center mt-2 cursor-pointer">
 <span className="px-1.5 py-0.5 rounded text-sm" style={{
    backgroundColor: '#C264B6',
    color: 'white',
    fontSize: '12px'
  }}>
   Max Pack required
 </span>
</span>}
</Note>;
};

<PlansAvailable plans={["business"]} maxPackRequired={false} />

Le [point de terminaison generateJWT](/apis/profiles/generate-jwt) génère une URL de liaison de réseau social pour un seul profil d'utilisateur.
Consultez l'[intégration de l'API des plans Business et Launch](/multiple-users/api-integration-business) pour plus de détails.

## Basculement entre les profils

Pour basculer entre différentes sessions de profil (par exemple, lors des tests avec plusieurs profils), vous devrez d'abord déconnecter le profil actuel. Consultez [Déconnexion automatique d'une session de profil](/multiple-users/api-integration-business#automatic-logout-of-a-profile-session) pour les instructions sur la gestion correcte du basculement entre profils.

## Clé privée et clé de profil

### Où obtenir la clé privée

Le fichier de clé privée (private.key) et un exemple de fichier JSON Postman sont inclus avec votre [package d'intégration](/multiple-users/api-integration-business#integration-package) reçu lors de l'intégration.
Le package d'intégration peut également être récupéré dans le tableau de bord développeur Ayrshare dans la page API -> Package d'intégration.

### Utilisation de la clé privée

Nous vous recommandons de lire la clé privée private.key à partir d'un fichier et de l'envoyer sous forme de chaîne dans le champ `privateKey`, ce qui vous permet de préserver tous les caractères, y compris les sauts de ligne.
La clé privée doit être précise, c'est-à-dire préserver tous les caractères, y compris les sauts de ligne.
Si vous collez la clé dans votre code, vous devrez peut-être remplacer manuellement les sauts de ligne par un caractère `\n` ou encoder la chaîne au format URL.

Coller la clé directement dans le code cause souvent des problèmes.

## Générer un JSON Web Token

Vidéo d'une minute expliquant comment générer un JSON Web Token (JWT) :

<div class="video-container">
  <iframe width="380" height="200" src="https://www.youtube.com/embed/JI232HBWHWc" title="Generate a JSON Web Token" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" />
</div>

L'URL JWT est valide pendant **5 minutes**. Après 5 minutes, vous devez générer une nouvelle URL JWT.
Consultez le [Max Pack `expiresIn`](/apis/profiles/generate-jwt-overview#jwt-expires-in) pour des options supplémentaires.

## Ouverture de l'URL JWT

Ouvrez l'URL JWT dans un nouvel onglet, une nouvelle fenêtre de navigateur ou un View Controller sur iOS.

Vous pouvez contrôler la [fermeture ou la redirection](/multiple-users/api-integration-business#opening-and-closing-the-social-linking-url) de la nouvelle fenêtre ou onglet.

<Note>
  Les réseaux sociaux ne permettent pas d'ouvrir l'URL dans une iFrame ni de masquer le domaine d'origine du partenaire approuvé profile.ayrshare.com.
</Note>

## Vérifier l'URL JWT

Le point de terminaison `generateJWT` ne valide pas l'URL JWT retournée par défaut.
Par exemple, si une clé privée corrompue est transmise à `generateJWT`, une URL sera néanmoins retournée et cette URL entraînera une erreur 401.

Vous pouvez vérifier l'URL JWT retournée en incluant `verify: true` dans les paramètres du corps de `generateJWT`. Si l'URL JWT ne peut pas être validée, une erreur sera retournée. Par exemple, si un caractère avait été supprimé de la clé privée, ce qui suit serait retourné :

```json JWT Error theme={"system"}
{
  "action": "JWT",
  "status": "error",
  "code": 189,
  "message": "Error generating JWT. Check the sent parameters, such as the privateKey has no extra tabs, spaces, or newlines. Also the entire private.key file including -----BEGIN RSA PRIVATE KEY----- and -----END RSA PRIVATE KEY-----. Error: secretOrPrivateKey must be an asymmetric key when using RS256"
}
```

Nous vous recommandons d'utiliser `verify: true` uniquement dans un environnement hors production, car la validation prend un temps de traitement supplémentaire.

## Test dans Postman

Il est **recommandé** de tester d'abord la création d'URL JWT dans [Postman](/testing/postman).
Inclus dans le package d'intégration, disponible dans la page API Key du profil principal du tableau de bord, se trouve un exemple de fichier JSON de configuration Postman contenant tout ce dont vous avez besoin pour vérifier votre création d'URL JWT.
Il suffit d'importer le fichier de configuration dans Postman, de remplir votre clé de profil (que vous trouverez dans le tableau de bord développeur Ayrshare en basculant vers le profil que vous souhaitez tester) dans le champ *body* `profileKey`, puis de cliquer sur le bouton bleu *Send*.
Tous les autres champs obligatoires sont déjà remplis.

Vous pouvez également [générer le code depuis Postman](/testing/postman#auto-generate-api-code-with-postman), ou lire le fichier de clé depuis un répertoire ou une base de données.

## Méthode de liaison Instagram

Les comptes Instagram peuvent être liés de [deux manières](/dashboard/connect-social-accounts/instagram) : directement avec **Instagram Login**, ou via une **page Facebook connectée**.
Le flux qui démarre lorsqu'un utilisateur clique sur le bouton Instagram sur la page de liaison sociale est normalement contrôlé par le paramètre à l'échelle du compte [Instagram Login](/multiple-users/manage-user-profiles#instagram-login) dans le tableau de bord.

Le paramètre de corps `instagramLinkMethod` du [point de terminaison generateJWT](/apis/profiles/generate-jwt) vous permet de remplacer ce paramètre pour une seule URL de liaison :

| Valeur      | Flux de liaison Instagram                             |
| ----------- | ----------------------------------------------------- |
| `instagram` | Instagram Login direct. Aucune page Facebook requise. |
| `facebook`  | Lien via une page Facebook connectée.                 |

Par exemple, si votre paramètre par défaut du compte est la liaison via page Facebook, ce qui suit force Instagram Login direct uniquement pour cette session de liaison :

```json Instagram Link Method theme={"system"}
{
  "instagramLinkMethod": "instagram"
}
```

L'URL JWT générée inclura le remplacement, et le fait de cliquer sur le bouton Instagram sur la page de liaison démarrera le flux demandé pour la durée de cette session — y compris à travers la redirection d'autorisation Instagram/Facebook.

Quelques points à savoir :

* Le remplacement s'applique uniquement à la page de liaison ouverte à partir de l'URL retournée. Il ne modifie pas votre paramètre Instagram Login à l'échelle du compte ni n'affecte les autres sessions de liaison.
* Si `instagramLinkMethod` est omis, la page de liaison utilise votre paramètre à l'échelle du compte, exactement comme avant.
* Si une valeur invalide est envoyée, une erreur `400` est retournée listant les valeurs valides (`instagram`, `facebook`).
* Passez en revue les [différences de fonctionnalités](/multiple-users/manage-user-profiles#direct-instagram-login-vs-facebook-page-authentication) entre les deux flux avant de choisir un remplacement — certaines fonctionnalités Instagram, telles que la recherche de hashtags et les collaborations, ne sont disponibles qu'avec l'authentification via page Facebook.

## Expiration du JWT

<PlansAvailable plans={["business"]} maxPackRequired />

Si vous souhaitez un délai d'expiration JWT plus long que les 5 minutes par défaut, incluez le champ `expiresIn`.

Par exemple, envoyez le JSON suivant pour définir l'URL JWT comme valide pendant 30 minutes :

```json JWT Expires In theme={"system"}
{
  "expiresIn": 30
}
```

Cela vous permet d'[envoyer le lien par e-mail](/apis/profiles/generate-jwt-overview#connect-accounts-email) à vos utilisateurs au lieu qu'ils aient à accéder à votre application ou plateforme.
Un cas d'utilisation courant est lorsque votre utilisateur doit reconnecter un compte social : vous pouvez lui envoyer par e-mail le lien JWT pour relier directement le compte social au lieu de devoir naviguer vers votre plateforme.

<Warning>
  Assurez-vous de vérifier avec votre équipe de sécurité combien de temps votre entreprise souhaite maintenir le JWT actif.
  Des délais d'expiration plus longs créent un risque supplémentaire qu'une partie non autorisée accède au lien.
</Warning>

## Intégrations

### JWT Bubble.io

Si vous êtes un utilisateur Bubble, consultez *Generate JWT Token* dans la section Bubble.io pour les instructions :

<Card title="Bubble Generate JWT" icon="link" href="/packages-guides/bubble#generate-jwt-token-in-bubble" horizontal />

### JWT Mobile

Les exemples de code Swift, Flutter et React Native suivants pour [mobile](/apis/profiles/generate-jwt-overview#mobile-code-examples) montrent comment lancer la page de liaison sociale sur un appareil iOS.
Remplacez la variable de type String `jwtURL` par le retour du [point de terminaison /generateJWT](/apis/profiles/generate-jwt).

#### Swift (iOS)

En Swift, utilisez un `UIViewController` et `SFSafariViewControllerDelegate`.
Nous ne recommandons pas d'utiliser un `WebView`, car certains réseaux sociaux comme Facebook et Google bloquent l'authentification.

#### Flutter (Dart)

En Flutter (Dart), il n'existe pas d'équivalent direct à un `UIViewController` ou au `SFSafariViewController`.
Cependant, vous pouvez obtenir une fonctionnalité similaire en utilisant le package `url_launcher` pour ouvrir des URL web.

#### React Native

React Native n'a pas non plus d'équivalent direct à `SFSafariViewController`, mais vous pouvez obtenir un résultat similaire avec l'API `WebBrowser` fournie par `expo-web-browser`, qui ouvre une URL dans une fenêtre modale de navigateur qui partage les cookies avec le navigateur système. Sinon, vous pouvez utiliser la fonction intégrée `Linking` de React Native pour ouvrir Safari : `await Linking.canOpenURL(jwtURL);`

#### Exemples de code mobile

<CodeGroup>
  ```swift Swift theme={"system"}
  import UIKit
  import SafariServices

  class ViewController: UIViewController, SFSafariViewControllerDelegate {
      
      var jwtURL = "https://profile.ayrshare.com?domain=acme&jwt=eyJhbGciOiJ"

      override func viewDidLoad() {
          super.viewDidLoad()
          setupButton()
      }
      
      func setupButton() {
          let button = UIButton(type: .system)
          button.frame = CGRect(x: (view.bounds.width - 200) / 2, y: (view.bounds.height - 50) / 2, width: 200, height: 50)
          button.setTitle("Open URL", for: .normal)
          button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
          view.addSubview(button)
      }

      @objc func buttonTapped() {
          openURLInInAppBrowser()
      }

      func openURLInInAppBrowser() {
          if let url = URL(string: jwtURL) {
              let safariVC = SFSafariViewController(url: url)
              safariVC.delegate = self
              present(safariVC, animated: true, completion: nil)
          }
      }

      // Optional: If you want to handle when the in-app browser is closed
      func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
          controller.dismiss(animated: true, completion: nil)
      }
  }
  ```

  ```dart Flutter theme={"system"}
  /** yaml dependencies
    dependencies:
      flutter:
        sdk: flutter
      url_launcher: ^6.2.1
  */

  import 'package:flutter/material.dart';
  import 'package:url_launcher/url_launcher.dart';

  void main() {
    runApp(MyApp());
  }

  class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      return MaterialApp(
        title: 'URL Launcher Example',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MyHomePage(),
      );
    }
  }

  class MyHomePage extends StatelessWidget {
    final String jwtURL = "https://profile.ayrshare.com?domain=acme&jwt=eyJhbGciOiJ";

    @override
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: Text('URL Launcher Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              openURLInBrowser(context);
            },
            child: Text('Open URL'),
          ),
        ),
      );
    }

    void openURLInBrowser(BuildContext context) async {
      if (await canLaunch(jwtURL)) {
        await launch(jwtURL);
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text('Could not launch $jwtURL'),
          ),
        );
      }
    }
  }
  ```

  ```jsx React Native theme={"system"}
  /**
  • Using the API provided by expo-web-browser,
  • which opens a URL in a modal browser window that shares cookies
  • with the system browser.

  • Learn more about expo: https://reactnative.dev/docs/environment-setup?guide=quickstart
  • and running the following command:
  • expo install expo-web-browser
  */

  import React from 'react';
  import { StyleSheet, Button, View } from 'react-native';
  import * as WebBrowser from 'expo-web-browser';

  export default function App() {
    const jwtURL = 'https://profile.ayrshare.com?domain=acme&jwt=eyJhbGciOiJ';

    const openURLInBrowser = async () => {
      try {
        await WebBrowser.openBrowserAsync(jwtURL);
        // Optional: WebBrowser.openBrowserAsync returns a promise that resolves with an object containing
        // 'type' that can be 'cancelled' or 'dismissed'. You can use this to handle when the browser is closed.
      } catch (error) {
        console.error(error);
      }
    };

    return (
      <View style={styles.container}>
        <Button title="Open URL" onPress={openURLInBrowser} />
      </View>
    );
  }

  const styles = StyleSheet.create({
    container: {
      flex: 1,
      justifyContent: 'center',
      alignItems: 'center',
    },
  });
  ```
</CodeGroup>

## E-mail Connect Accounts

<max_pack />

Conjointement avec l'option de délai d'expiration plus long, vous pouvez également faire en sorte qu'Ayrshare envoie automatiquement à vos utilisateurs un lien vers la page de liaison sociale.

### JSON Connect Accounts

Par exemple, le JSON suivant enverra un e-mail à `john@user.com` avec le nom de l'entreprise ACME, l'e-mail de contact `support@mycompany.com`, et des liens vers les conditions et la politique de confidentialité :

```json Example Contact Email Request theme={"system"}
/**
  All fields are in the email object required.
  Missing fields will cause the email to fail.
*/
{
  "email": {
    "to": "john@user.com",
    "contactEmail": "support@mycompany.com",
    "company": "ACME",
    "termsUrl": "https://www.ayrshare.com/terms",
    "privacyUrl": "https://www.ayrshare.com/privacy",
    "expiresIn": 60
  }
}
```

La réponse inclura ce qui suit si l'e-mail et le délai d'expiration ont été définis :

```json Example Contact Email Response theme={"system"}
{
  "emailSent": true,
  "expiresIn": "30m"
}
```

### Exemple d'e-mail JWT Connect Accounts

Voici un exemple d'e-mail avec le lien Connect Account qui ouvre la page de liaison sociale :

<img src="https://mintcdn.com/ayrshare-docs/Nmrhj2Gh7WSf62Bh/images/apis/profiles/jwt-email.webp?fit=max&auto=format&n=Nmrhj2Gh7WSf62Bh&q=85&s=fbe4ee86ca59c26a5bd5b289fda96b8b" alt="JWT Email" width="563" class="center" data-path="images/apis/profiles/jwt-email.webp" />

L'e-mail proviendra de l'adresse :

`Social Connect Hub <connect@socialconnecthub.com>`
