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

# Authentification et autorisation d’un appareil Tessel avec Auth0

> Comment 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 étonnante. Non seulement elle a une excellente spécification matérielle et une grande histoire d’extensibilité, mais vous pouvez la programmer en Javascript! Lorsqu’elle a été annoncée sur Kickstarter, nous l’avons immédiatement soutenue et avons attendu de longues semaines pour nous en procurer une.

<Frame>
  <img src="https://mintcdn.com/docs-dev-actions-triggers-prototype/AzFg9TUnnX-9tz7j/docs/images/fr-ca/cdy7uua7fh8z/5mSnxvHvgWrHtCwk35z4Db/891c39e289c58d97c7a4047084d118a5/TM-00-04-ports.png?fit=max&auto=format&n=AzFg9TUnnX-9tz7j&q=85&s=7d7748f07e3b1248d0f94b361101e8ba" alt="Tessel - Tessel Ports Diagram" width="750" height="511" data-path="docs/images/fr-ca/cdy7uua7fh8z/5mSnxvHvgWrHtCwk35z4Db/891c39e289c58d97c7a4047084d118a5/TM-00-04-ports.png" />
</Frame>

Elle est enfin arrivée et nous avons pu écrire notre premier programme : obtenir un jeton d’Auth0 et appeler une API.

Tessel vise une compatibilité totale avec Javascript. La plupart des modules Node de base fonctionnent également, mais pas tous. Consultez [la documentation de Tessel sur Github](https://github.com/tessel/docs/blob/master/compatibility.md) pour plus de détails.

## L’exemple

Cet exemple est simple :

1. Nous appelons le point de terminaison du Propriétaire de la ressource sur Auth0 avec les informations d’identification de l’appareil
2. Nous obtenons un jeton en retour
3. Nous utilisons le jeton pour appeler une API

<Frame>
  <img src="https://mintcdn.com/docs-dev-actions-triggers-prototype/sobog9Qdm0HQ6dwk/docs/images/fr-ca/cdy7uua7fh8z/3iyOfO564gkbyQSsvTJE9c/a981ca1166d1384ba2e5e7dd72f5a255/2023-09-22_13-14-21.png?fit=max&auto=format&n=sobog9Qdm0HQ6dwk&q=85&s=3a830bc4f79564173e502b1754fad551" alt="Tessel - Tessel to Auth0 Flow Diagram" width="730" height="187" data-path="docs/images/fr-ca/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 = 'THE TESSEL PASSWORD';

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

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

    getDeviceProfile(token.access_token, function(e, profile){
      console.log("Device profile:");
      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 forts du code à noter :

1. Ce code est compatible à 99 % avec Node (le seul module spécifique à l’appareil est `tessel`, que nous utilisons uniquement pour nous assurer que tous les appels SSL sont effectués avec des références temporelles adéquates.
2. La fonction `requête` est un simple « wrapper » sur les fonctions du module `http`. Le module `requête` ne fonctionne pas actuellement dans Tessel.

Le point de terminaison <Tooltip href="/docs/fr-ca/glossary?term=resource-owner" tip="Propriétaire de ressources
Entité (telle qu’un utilisateur ou une application) capable d’accorder l’accès à une ressource protégée." cta="Voir le glossaire">Resource Owner</Tooltip> (Propriétaire de la ressource) nécessite des informations d’identification (telles que le nom d’utilisateur et le mot de passe), de sorte que le magasin d’utilisateurs du système dorsal connecté à Auth0 doit prendre en charge ces informations (comme une connexion à une base de données ou à Entra ID).

## Configuration Tessel

* Exécutez `tessel update` pour vous assurer que vous installez le dernier micrologiciel avec le support SSL.
* Vous aurez évidemment besoin d’une connexion au web. Vous pouvez configurer le WiFi avec la commande `tessel wifi`.
* Envoyez toujours les informations d’identification (telles que `nom d’utilisateur`/`mot de passe`) sur des réseaux sécurisés.

## Résumé

Tessel est génial. Nous voyons beaucoup de potentiel. Cet exemple montre à quel point il est facile de le connecter avec Auth0.
