Aller au contenu principal

Gestion des erreurs

Les API d’authentification lèvent des sous-classes de MisskeyAuthException. Interceptez les types que vous souhaitez traiter séparément, puis interceptez les autres avec MisskeyAuthException.

import 'dart:developer';

try {
await auth.loginWithOAuth(config);
} on UserCancelledException {
// L’utilisateur a fermé le navigateur. En général, inutile de le signaler.
} on OAuthNotSupportedException {
// Le serveur ne prend pas en charge OAuth. Essayez plutôt MiAuth.
} on NetworkException catch (e) {
// Délai dépassé, absence de connexion, erreur TLS, etc.
log('Network error', error: e.originalException);
} on MisskeyAuthException catch (e) {
log('Authentication failed: ${e.message} ${e.details ?? ''}');
}

Chaque exception possède les propriétés suivantes :

  • message : description courte
  • details : informations supplémentaires, le cas échéant
  • originalException : exception d’origine, le cas échéant

message et details sont destinés aux journaux. Certains messages sont en japonais. Affichez aux utilisateurs vos propres textes en fonction du type d’exception.

Exceptions​

Communes​

ExceptionCondition de déclenchement
UserCancelledExceptionL’utilisateur a fermé le navigateur ou annulé l’authentification. Consultez également Configuration des plateformes
CallbackSchemeErrorExceptionLe message d’erreur de la plateforme mentionne le rappel, ce qui signifie généralement que le schéma d’URL de rappel n’est pas enregistré ou ne correspond pas
AuthorizationLaunchExceptionLe navigateur n’a pas pu s’ouvrir ou la plateforme a signalé une autre erreur
NetworkExceptionUne requête a échoué sans réponse : délai dépassé, absence de connexion, erreur TLS, etc. loginWithOAuth la lève également si /api/i renvoie un statut d’erreur
ResponseParseExceptionUne réponse ne correspondait pas au JSON attendu ou un champ obligatoire, comme le jeton ou l’id de l’utilisateur, était manquant
MisskeyAuthExceptionErreur inattendue. Classe de base de toutes les exceptions ci-dessus et ci-dessous

OAuth​

ExceptionCondition de déclenchement
OAuthNotSupportedExceptionLe serveur ne prend pas en charge OAuth (/.well-known/oauth-authorization-server a renvoyé 404 ou 501)
ServerInfoExceptionLa requête d’informations du serveur a renvoyé un statut d’erreur autre que 404 ou 501, son issuer ne correspond pas exactement à https://{host}, ou son point de terminaison d’autorisation ou de jeton n’est pas une URL HTTPS absolue. Contrairement à OAuthNotSupportedException, cela ne signifie pas que vous devez utiliser MiAuth
StateMismatchExceptionLe state du rappel est absent ou ne correspond pas à la requête
AuthorizationServerErrorExceptionLe rappel contient un error, par exemple access_denied lorsque l’utilisateur refuse l’accès. details contient error et error_description
AuthorizationCodeMissingExceptionLe rappel ne contient aucun code d’autorisation ou en contient plusieurs
TokenExchangeExceptionLe point de terminaison de jeton a renvoyé une erreur. Le message contient le statut HTTP et l’erreur renvoyée par le serveur

MiAuth​

ExceptionCondition de déclenchement
MiAuthDeniedExceptionL’API de vérification a renvoyé ok: false. L’utilisateur a peut-être refusé l’accès, mais Misskey renvoie aussi cette valeur pour une session inconnue ou déjà utilisée
MiAuthSessionInvalidExceptionLe rappel concerne une autre session, ou l’API de vérification a renvoyé 404 ou 410
MiAuthCheckFailedExceptionL’API de vérification a renvoyé un autre statut d’erreur

Exceptions non levées par la version actuelle​

InvalidAuthConfigException, SecureStorageException et MiAuthNotSupportedException sont définies, mais ne sont pas levées par la version actuelle.

Erreurs de stockage​

SecureTokenStore n’encapsule pas les erreurs de flutter_secure_storage. Elles parviennent à votre code telles que ce package les lève, généralement sous la forme de PlatformException. Si les données stockées sont corrompues, leur lecture peut également lever FormatException ou TypeError. Traitez ces erreurs autour des appels à MisskeyAuthManager qui lisent ou écrivent des jetons, notamment loginWithOAuth et loginWithMiAuth, qui enregistrent le jeton après l’authentification.

loginWithOAuth et loginWithMiAuth enregistrent d’abord le jeton, puis activent le compte. Si seule l’opération d’activation du compte échoue, le jeton reste enregistré, mais le compte n’est pas actif.

Nouvelles tentatives​

  • La récupération des informations du serveur OAuth et l’appel à /api/i font jusqu’à trois tentatives au total en cas de délai dépassé, d’erreur de connexion, d’autre erreur de transport ou de réponse HTTP 429, 500, 502, 503 ou 504.
  • L’échange du jeton et l’API de vérification MiAuth ne font pas de nouvelle tentative. Un code d’autorisation et une session MiAuth ne peuvent être utilisés qu’une fois, et le serveur peut avoir traité la requête même si la réponse a été perdue. Recommencez l’authentification depuis le début.

Échec de connexion après l’authentification​

loginWithOAuth appelle /api/i après avoir obtenu un jeton. Si cet appel échoue, la méthode lève une exception et n’enregistre pas le jeton. loginWithOAuth et loginWithMiAuth lèvent également une exception sans enregistrer le jeton si les informations utilisateur ne contiennent pas d’id.

Dans ces cas, le serveur a déjà émis le jeton, qui y reste valide ; la bibliothèque ne le révoque pas. L’utilisateur peut se reconnecter, ce qui émet un nouveau jeton.