Use this file to discover all available pages before exploring further.
MQTT est un protocole léger souvent utilisé par les appareils pour communiquer avec d’autres systèmes. Il est conçu pour le modèle de messagerie publication/abonnement. Vous pouvez en savoir plus sur MQTT sur Wikipedia.D’une manière générale, il y a trois composantes :
Un publisher de messages.
Un subscriber de messages.
Un broker qui relie l’un et l’autre.
Il existe une notion de topics (également appelés channels ou subjects) auxquels les messages sont associés. Les sujets sont utilisés pour acheminer les messages entre les éditeurs et les abonnés.Le protocole MQTT prend en charge un mécanisme d’authentification de base basé sur des usernames et des passwords. Ces identifiants sont envoyés avec le message CONNECT.Cet article montre une intégration entre un agent MQTT basé sur nodejs : mosca et Auth0. Dans cet exemple, Auth0 est utilisé pour authentifier les publishers et subscribers auprès de l’agent, puis pour autoriser l’acheminement des messages.
mosca est facile à héberger et peut être intégré à d’autres serveurs. Pour les besoins de cet exemple, nous nous contentons d’héberger nous-mêmes un serveur mosca :
var mosca = require('mosca')var Auth0Mosca = require('auth0mosca');var settings = { port: 9999,};//'Thermostats' is a Database connection where all devices are registered.var auth0 = new Auth0Mosca('https://eugeniop.auth0.com', '{Your Auth0 ClientID}', '{Your Auth0 Client Secret}','Thermostats');//Setup the Mosca servervar server = new mosca.Server(settings);//Wire up authentication & authorization to moscaserver.authenticate = auth0.authenticateWithCredentials();server.authorizePublish = auth0.authorizePublish();server.authorizeSubscribe = auth0.authorizeSubscribe();server.on('ready', setup);// Fired when the mqtt server is readyfunction setup() { console.log('Mosca server is up and running');}server.on('clientConnected', function(client) { console.log('New connection: ', client.id );});
Cela crée un serveur qui écoute les messages MQTT sur le port 9999. mosca vous permet de remplacer les trois fonctions utilisées pour authentifier et autoriser les opérations.Dans cet exemple, nous utilisons un module très simple, auth0mosca, pour exécuter ces fonctions. Auth0 est connecté à mosca.
Ce petit module fiournit les quatre fonctions utilisées par mosca, authenticateWithCredentials, authenticateWithJWT, authorizePublish et authorizeSubscribe :
authenticateWithCredentials utilise OAuth2 Propriétaire de ressource, attribution de mot de passe et d’identifiant pour authentifier l’agent et toutes les connexions qui lui sont adressées. Chaque fois qu’un publisher ou un subscriber envoie un message CONNEXION à l’agent, la fonction authenticate est appelée. Nous y appelons le point de terminaison Auth0 et lui transmettons leusername/password. Auth0 le valide par rapport à sa base de données de comptes (c’est le premierrequest.post dans le code). En cas de succès, il valide et analyse le jeton Web JSON () pour obtenir le profil de l’appareil et l’ajoute à l’objet client qui représente soit le subscriber ou le publisher. Cela se produit dans l’appel jwt.verify.Par convention, tous les appareils connectés à l’agent ont un compte dans Auth0.Remarquez que le profil de l’appareil a également une propriété topics. Il s’agit d’un tableau contenant tous les sujets auxquels cet appareil particulier est autorisé à accéder. Dans la capture d’écran ci-dessus, le thermostat-1a sera autorisé à publier (ou à s’abonner) aux sujets temperature et config.Les fonctionnalités authorizePublish et authorizeSubscribe vérifient simplement qu’un sujet particulier demandé est présent dans cette liste.authenticateWithJWT attend un JWT dans le champ password. Dans ce cas, le flux est légèrement différent :
L’éditeur et l’abonné obtiendront un jeton
Ils se connectent à mosca en soumettant le JWT
mosca valide le JWT
Les messages sont envoyés et retransmis aux abonnés
Les éditeurs et les abonnés obtiendront le JWT d’une manière ou d’une autre. Notez que l’agent n’a plus besoin de communiquer avec Auth0. Les JWT sont des artefacts autonomes qui peuvent être validés à l’aide du secret utilisé pour les signer.
Cela montre à quel point il est facile d’utiliser Auth0 dans différents scénarios. Le magasin d’utilisateurs d’Auth0 est utilisé pour gérer les appareils. Bien entendu, des règles d’autorisation beaucoup plus sophistiquées pourraient être élaborées sur la base d’autres conditions : heure, lieu, device_id, etc. Toutes ces règles seraient très simples à mettre en œuvre, soit au moyen d’attributs de profil supplémentaires, soit au moyen de règles. Cela montre également comment le profil Auth0 flexible peut être étendu pour prendre en charge des artefacts arbitraires (tels que les topics dans l’exemple).Pour en savoir plus sur les règles, consultez Règles d’Auth0.Il n’est jamais bon d’envoyer des identifiants (username/password) sur des réseaux non sécurisés. Il existe d’autres implémentations qui fournissent une sécurité au niveau du transport qui empêcherait le contenu des messages d’être révélé. mosca prend en charge TLS par exemple. Il est probable qu’un déploiement en production privilégie cette solution, à moins que tout le trafic se fasse dans un réseau fermé.