> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Comment authentifier et autoriser un appareil Tessel avec Auth0.

# Authentifier et autoriser un appareil Tessel avec Auth0

export const AuthCodeBlock = ({filename, icon, language, highlight, children}) => {
  const [displayText, setDisplayText] = useState(children);
  const [copyText, setCopyText] = useState(children);
  const wrapperRef = React.useRef(null);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      if (!window.autorun || !window.rootStore) {
        return;
      }
      unsubscribe = window.autorun(() => {
        let processedChildrenForDisplay = children;
        let processedChildrenForCopy = children;
        for (const [key, value] of window.rootStore.variableStore.values.entries()) {
          const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
          let displayValue = value;
          if (key === "{yourClientSecret}" && value !== "{yourClientSecret}") {
            displayValue = value.substring(0, 3) + "*****MASKED*****";
          }
          processedChildrenForDisplay = processedChildrenForDisplay.replaceAll(new RegExp(escapedKey, "g"), displayValue);
          processedChildrenForCopy = processedChildrenForCopy.replaceAll(new RegExp(escapedKey, "g"), value);
        }
        setDisplayText(processedChildrenForDisplay);
        setCopyText(processedChildrenForCopy);
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  useEffect(() => {
    if (!wrapperRef.current) return;
    const originalWriteText = navigator.clipboard.writeText.bind(navigator.clipboard);
    let isOverriding = false;
    const handleClick = e => {
      const button = e.target.closest('[data-testid="copy-code-button"]');
      if (!button || !wrapperRef.current.contains(button)) return;
      isOverriding = true;
      navigator.clipboard.writeText = text => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
          return originalWriteText(copyText);
        }
        return originalWriteText(text);
      };
      setTimeout(() => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
        }
      }, 100);
    };
    const wrapper = wrapperRef.current;
    wrapper.addEventListener('click', handleClick, true);
    return () => {
      wrapper.removeEventListener('click', handleClick, true);
      if (navigator.clipboard.writeText !== originalWriteText) {
        navigator.clipboard.writeText = originalWriteText;
      }
    };
  }, [copyText]);
  return <div ref={wrapperRef}>
      <CodeBlock filename={filename} icon={icon} language={language} lines highlight={highlight}>
        {displayText}
      </CodeBlock>
    </div>;
};

[Tessel](https://tessel.io) est une carte formidable. Non seulement elle offre d’excellentes caractéristiques matérielles et une grande capacité d’extension, mais vous pouvez aussi la programmer en JavaScript! Lorsqu’elle a été annoncée sur Kickstarter, nous l’avons appuyée immédiatement et avons attendu de longues semaines avant de pouvoir en obtenir une.

<Frame>
  <img src="https://mintcdn.com/translations/MV7tE-x71x8RWRES/docs/images/cdy7uua7fh8z/5mSnxvHvgWrHtCwk35z4Db/891c39e289c58d97c7a4047084d118a5/TM-00-04-ports.png?fit=max&auto=format&n=MV7tE-x71x8RWRES&q=85&s=f45a5b2ef919cd9361f00bfd78a1a2ad" alt="Tessel - Diagramme des ports Tessel" width="750" height="511" data-path="docs/images/cdy7uua7fh8z/5mSnxvHvgWrHtCwk35z4Db/891c39e289c58d97c7a4047084d118a5/TM-00-04-ports.png" />
</Frame>

Elle est finalement arrivée, et nous pouvons écrire notre premier programme : obtenir un jeton auprès d’Auth0 et appeler une API.

Tessel vise une compatibilité complète avec JavaScript. La plupart des modules de base de Node fonctionnent aussi, mais pas tous. Consultez [la documentation de Tessel sur GitHub](https://github.com/tessel/docs/blob/master/compatibility.md) pour en savoir plus.

<div id="the-sample">
  ## L’exemple
</div>

Cet exemple est assez simple :

1. Nous appelons le point de terminaison Resource Owner sur Auth0 avec les identifiants de l’appareil
2. Nous obtenons un jeton en retour
3. Nous utilisons ce jeton pour appeler une API

<Frame>
  <img src="https://mintcdn.com/translations/3nS3prIggmJG9TUI/docs/images/cdy7uua7fh8z/3iyOfO564gkbyQSsvTJE9c/a981ca1166d1384ba2e5e7dd72f5a255/2023-09-22_13-14-21.png?fit=max&auto=format&n=3nS3prIggmJG9TUI&q=85&s=42ef91ca36894e33b5534af1d185e78d" alt="Tessel - Schéma du flux de Tessel vers Auth0" width="730" height="187" data-path="docs/images/cdy7uua7fh8z/3iyOfO564gkbyQSsvTJE9c/a981ca1166d1384ba2e5e7dd72f5a255/2023-09-22_13-14-21.png" />
</Frame>

export const codeExample = `var http = require('https');
var tessel = require('tessel');

tessel.syncClock(function () {

  var device_id = 'tessel-01';
  var password = 'LE MOT DE PASSE DU TESSEL';

  authenticate(device_id, password, function(e,token){

    if(e) return console.log("Erreur :" + e);

    getDeviceProfile(token.access_token, function(e, profile){
      console.log("Profil de l’appareil :");
      console.log(profile);
    });
  });

  function getDeviceProfile(token, done){
    request('{yourDomain}',
          '/userinfo',
          'GET',
          {
          "Content-type": "application/json",
          "Authorization": "Bearer " + token
        },
        null,
        function(e,response){
          if(e) return done(e);
          done(null, JSON.parse(response));
        });
  }

  function authenticate(device_id, password, done)
  {
    request('{yourDomain}',
          '/oauth/ro',
          'POST',
          {
          "Content-type": "application/json",
        },
        JSON.stringify({
            client_id:   '{yourClientId}',
            username:    device_id,
            password:    password,
            connection:  'devices',
            grant_type:  "password",
            scope: 'openid'
          }),
          function(e,response){
            if(e) return done(e);
            done(null, JSON.parse(response));
        });
  }

  function request(host, path, method, headers, body, done){
    var options = {
      hostname: host,
      path: path,
      method: method,
      headers: headers
    };

    var req = http.request(options, function(res) {
      res.setEncoding('utf8');

      var response = "";

      res.on('data', function (chunk) {
        response += chunk;
      });

      res.on('end', function(){
        done(null, response);
        });
    });

    req.on('error', function(e) {
      done(e);
    });

    if( body ) req.write(body);
    req.end();
  }
});`;

<AuthCodeBlock children={codeExample} language="javascript" />

Points à retenir du code :

1. Ce code est compatible à 99 % avec Node (le seul `module` propre à l’appareil est `tessel`, que nous utilisons uniquement pour nous assurer que tous les appels SSL s’effectuent avec des références temporelles adéquates).
2. La fonction `request` n’est qu’un simple wrapper autour des fonctions du module `http`. Le module `request` ne fonctionne pas actuellement dans Tessel.

Le point de terminaison <Tooltip tip="Propriétaire de la ressource : entité (comme un utilisateur ou une application) capable d’accorder l’accès à une ressource protégée." cta="Voir le glossaire" href="/fr-CA/docs/glossary?term=Resource+Owner">propriétaire de la ressource</Tooltip> exige des identifiants (comme un nom d’utilisateur et un mot de passe); le répertoire d’utilisateurs côté serveur connecté à Auth0 doit donc prendre cela en charge (par exemple, une connexion de base de données ou Active Directory).

<div id="tessel-setup">
  ## Configuration de Tessel
</div>

* Exécutez `tessel update` pour vous assurer d’installer le micrologiciel le plus récent avec la prise en charge de SSL.
* Vous aurez évidemment besoin d’une connexion à Internet. Vous pouvez configurer le Wi-Fi avec la commande `tessel wifi`.
* Envoyez toujours les identifiants (comme `username`/`password`) sur des réseaux sécurisés.

<div id="summary">
  ## Résumé
</div>

Tessel est formidable. Nous lui voyons un énorme potentiel. Cet exemple montre à quel point il est facile de l’intégrer à Auth0.
