Suite au coatching, j’ai tenté de bosser la gestion des tokens pour l’authentification des requêtes Directus. J’ai choisi de stocker l’accessToken et le refreshToken et de les réinitialiser à vide après un certain temps. Mais j’ai l’impression que mon timer ne se met. jamais en route pour remettre à vide mes tokens. Est-ce que vous voyez un problème sur mon code ?
En plus de ce problème là, je viens de percuter que je créé un RemoteDataProvider par viewModel.
En gros, View1 appelle ViewModel1 qui utilise une instance d’un objet Manager qui appelle une instance d’un RemoteDataProvider. Et View2 appelle ViewModel2 qui utilise une autre instance de l’objet Manager qui appelle une autre instance d’un RemoteDataProvider. Comme je stocke mon accessToken et mon refreshToken dans mon RemoteDataProvider, je relance une connexion login/mot de passe pour chacune des vues …
Est-ce normal de créer une instance pour chaque vue ? Doit-on remonter le stockage des tokens ailleurs pour que tous les appels puissent en profiter ?
Pour le token, je te conseille d’éviter les timers. Il vaut mieux que tu stockes ton token, ton token refresh et la date d’expiration dans 3 variables.
Puis, à chaque fois que tu t’apprêtes à lancer une requête tu commences par vérifier la date d’expiration :
si elle est dans le futur alors tu peux faire ta requête avec ton token
si elle est dans le passé alors tu utilises ton token refresh pour regenerer un nouveau token avant de faire ta requete
Non, il faudrait que tu n’aies qu’une seule instance de ton RemoteDataProvider sinon tu va recréer sans arrêt des tokens alors que les précédents sont encore valides
Dans l’idéal, il te faudrait un objet qui chapeaute ta navigation, une sorte de routeur qui crée chacun des écrans et leur fait passer ce dont ils ont besoin. C’est assez complexe à mettre en place et c’est justement l’objet du cours avancé d’architecture et de navigation que je viens de sortir en Dart/Flutter.
Il faudra faire une version iOS/Swift de ce cours, mais avec la WWDC qui a lieu dans 1 mois et demi ça fait un peu tard pour sortir un cours Swift/SwiftUI avec un risque de changements importants.
La solution la plus rapide et la plus simple pour toi serait le singleton pour ton RemoteDataProvider
Je vais laisser en l’état pour l’instant. Mon appli n’est pas prête de sortir, il me reste beaucoup de boulot. Et je verrai par la suite si tu proposes un cours dans ce sens
Tu peux declarer ton RemoteDataProvider() dans ton App et la passer a une vue contenant toutes les autres : « MainScreen » par example (ou tout autre vue contenant toutes les vues où tu en a besoin, comme a expliqué @mbritto).
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
MainScreen(dataProvider: RemoteDataProvider())
}
}
}
struct MainScreen<T>: View where T: RemoteDataProviderProtocol {
@ObservedObject private var dataProvider: T
init(dataProvider: T) {
self.dataProvider = dataProvider
}
var body: some View {
VStack {
if dataProvider.isLoggedIn {
HomeScreen(dataProvider: dataProvider)
} else {
LoginScreen(dataProvider: dataProvider)
}
}
}
}
Puis dans tes écrans descendants, récupérer le DataProvider, en le passant par le onAppear, et ajouter son propre ViewModel :
struct HomeScreen<T>: View where T: RemoteDataProviderProtocol {
@ObservedObject var dataProvider: T
@StateObject private var viewModel = HomeViewModel()
var body: some View {
Text("Home Screen")
.onAppear {
self.viewModel.dataProvider = self.dataProvider as? RemoteDataProviderProtocol
}
}
}
Le protocole doit conformer à ObservableObject :
protocol RemoteDataProviderProtocol: ObservableObject {
var isLoggedIn: String { get }
func login() -> Void
}
@Tazooou et @mbritto Petite question sur cette explication qui me bloque dans la compréhension :
Je comprends que le token à une durée d’expiration.
Je pensais jusqu’à présent que le refreshToken avait cette même durée d’expiration mais du coup je doute : Le refreshToken a-t-il une durée d’expiration ou il a une durée de vie illimitée ?
Désolé pour le délai de réponse. Non, le refresh Token n’a pas la même durée d’expiration mais il en a une tout de même !
Elle est plus longue que le token puisque tu es censé l’utiliser moins souvent dans tes requêtes.
Par défaut, je crois que c’est 7 jours mais tu peux tout à fait le paramétrer toi même sur ton serveur.
Je vais essayer de te retrouver le sujet qui traitait de ça
refresh_tokenchaîne
Le jeton qui peut être utilisé pour récupérer un nouveau jeton d’accès via /auth/refresh. Remarque : si vous avez utilisé cookie le mode dans la requête, le jeton d’actualisation ne sera pas renvoyé dans le JSON.
Merci @Tazooou pour l’info bien utile Bon du coup il faut bien conserver le mp ou demander à l’utilisateur de se reco moi qui croyait en avoir finit avec ce Login xD
En tout cas merci pour les éléments ca m’aide beaucoup !