ApsaraMQ for MQTT prend en charge l'authentification par jeton pour contrôler l'accès des clients aux ressources de messagerie. Cette rubrique explique comment configurer les paramètres de connexion avec des jetons, mettre à jour les jetons sans déconnexion et gérer les notifications d'expiration et d'invalidation des jetons.
Flux d'authentification
L'authentification par jeton suit la séquence suivante :
Votre application demande des jetons au service de jetons ApsaraMQ for MQTT, en spécifiant les ressources et les types d'autorisation (lecture, écriture ou les deux).
Le client MQTT se connecte au broker en incluant les données du jeton dans les champs
UsernameetPassworddu paquet CONNECT.Le broker vérifie le jeton et accorde l'accès aux ressources spécifiées.
Pendant la session, le client peut mettre à jour les jetons en publiant sur un sujet système ; le broker envoie alors des notifications en cas d'expiration ou d'invalidation du jeton.
Types de jetons
Chaque client ApsaraMQ for MQTT peut détenir un jeton par type et utiliser un ou plusieurs types simultanément.
| Identifiant de type | Autorisation | Description |
|---|---|---|
| R | Lecture seule | Accorde l'autorisation de lecture pour les ressources spécifiées |
| W | Écriture seule | Accorde l'autorisation d'écriture pour les ressources spécifiées |
| RW | Lecture et écriture | Accorde les autorisations de lecture et d'écriture pour les ressources spécifiées |
Paramètres de connexion
Pour vous connecter avec une authentification par jeton, définissez les champs Username et Password dans le paquet MQTT CONNECT comme suit.
Nom d'utilisateur
Format : Token|<AccessKey ID>|<Instance ID>
| Composant | Description |
|---|---|
Token |
La chaîne littérale Token, indiquant le mode d'authentification par jeton |
<AccessKey ID> |
Votre AccessKey ID Alibaba Cloud |
<Instance ID> |
L'ID de votre instance ApsaraMQ for MQTT |
Exemple :
Pour un client dont l'ID est GID_Test@@@0001, l'ID d'instance mqtt-xxxxx et l'AccessKey ID YYYYY :
Token|YYYYY|mqtt-xxxxx
Mot de passe
Format : Paires de type et de contenu de jeton concaténées avec des barres verticales (|). Les différents types de jetons peuvent apparaître dans n'importe quel ordre.
Exemples :
-
Jeton unique : Si le client détient un jeton en lecture seule
123, définissez Password sur :R|123 -
Plusieurs jetons : Si le client détient un jeton en lecture seule
123et un jeton en écriture seuleabcd, définissez Password sur :R|123|W|abcd
Tous les jetons du champ Password doivent être valides. Si un jeton est invalide, le broker peut rejeter la connexion.
Mise à jour des jetons sans déconnexion
Par défaut, pour renouveler un jeton, déconnectez le client et reconnectez-le avec le nouveau jeton. Pour éviter la déconnexion, publiez un message de mise à jour de jeton sur le sujet système $SYS/uploadToken. Le broker remplace le jeton dans sa session sans interrompre la connexion.
Procédure de mise à jour
Publiez un message JSON vers
$SYS/uploadTokencontenant le nouveau jeton.Attendez la réponse PUBACK avant toute opération de publication ou d'abonnement. Si le client poursuit ses opérations sans attendre, le broker risque de continuer à s'authentifier avec l'ancien jeton, ce qui entraînera un échec d'authentification et une déconnexion.
Mettez à jour la configuration locale du jeton afin que le client utilise le nouveau jeton lors de la prochaine reconnexion.
Format du message
Sujet : $SYS/uploadToken
Charge utile : Chaîne JSON contenant les champs suivants :
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
| token | String | Oui | La nouvelle chaîne de jeton |
| type | String | Oui | Type de jeton : R, W ou RW. Un type invalide provoque une erreur de vérification des autorisations. |
Exemple de charge utile :
{
"token": "<your-token-string>",
"type": "RW"
}
Réponse : Un message PUBACK standard.
Mettez toujours à jour la configuration locale du jeton après une mise à jour réussie. Sinon, le client risque d'utiliser les anciennes données de jeton lors de la prochaine reconnexion.
Notifications d'expiration de jeton
Le broker ApsaraMQ for MQTT envoie des avertissements d'expiration aux clients via le sujet système $SYS/tokenExpireNotice. Aucun abonnement n'est requis : le broker délivre ces notifications directement.
Sujet : $SYS/tokenExpireNotice
Charge utile : Chaîne JSON contenant les champs suivants :
| Paramètre | Type | Description |
|---|---|---|
| expireTime | Long | Heure d'expiration du jeton sous forme d'horodatage Unix en millisecondes |
| type | String | Type de jeton : R, W ou RW |
Comportement des notifications
Le broker envoie généralement une notification environ 5 minutes avant l'expiration d'un jeton.
La livraison n'est pas garantie. Ne comptez pas uniquement sur ces notifications pour gérer le cycle de vie des jetons.
Après avoir reçu une notification, demandez un nouveau jeton et mettez-le à jour rapidement pour éviter les échecs de messagerie.
Notifications d'invalidation de jeton
Lorsque le broker détecte une erreur de vérification de jeton, il envoie une notification d'erreur au client via le sujet système $SYS/tokenInvalidNotice puis déconnecte le client. Aucun abonnement n'est requis.
Sujet : $SYS/tokenInvalidNotice
Charge utile : Chaîne JSON contenant les champs suivants :
| Paramètre | Type | Description |
|---|---|---|
| code | int | Code d'erreur identifiant le type d'échec de vérification du jeton |
| type | String | Type de jeton : R, W ou RW |
Codes d'erreur
| Code | Description |
|---|---|
| 1 | Le jeton est falsifié et ne peut pas être analysé |
| 2 | Le jeton a expiré |
| 3 | Le jeton a été révoqué |
| 4 | La ressource et le jeton ne correspondent pas |
| 5 | Le type d'autorisation et le jeton ne correspondent pas |
| 8 | La signature est invalide |
| -1 | L'autorisation du compte est invalide |
Comportement de déconnexion
En cas d'erreur de vérification de jeton par le broker :
L'authentification échoue.
Le broker envoie le code d'erreur au client via
$SYS/tokenInvalidNotice.Le broker déconnecte le client.
Utilisez le code d'erreur pour identifier la cause racine et prendre les mesures correctives nécessaires avant de vous reconnecter.
Bonnes pratiques
Utilisez des jetons à courte durée de vie. Définissez une période de validité raisonnable pour les jetons afin de limiter l'impact d'une éventuelle fuite.
Activez TLS. Chiffrez les connexions client pour empêcher l'interception des jetons pendant la transmission.
Gérez proactivement l'expiration. Implémentez une logique d'actualisation des jetons dans votre client plutôt que de compter uniquement sur les notifications d'expiration du broker, car leur livraison n'est pas garantie.
Stockez les identifiants en toute sécurité. Récupérez votre AccessKey ID à partir de variables d'environnement ou d'un gestionnaire de secrets au lieu de le coder en dur dans votre application.
Maintenez la synchronisation entre les jetons locaux et ceux du broker. Après avoir mis à jour un jeton via
$SYS/uploadToken, mettez toujours à jour la configuration locale pour éviter l'utilisation de jetons obsolètes lors de la reconnexion.