Login Users sur RealmSwift. Quel type d'authentification choisir?

Bonjour à tous,

Je rencontre un problème d’authentification de l’utilisateur sur une application que je viens de terminer et qui utilise RealmSwift en mode Synchro comme Maxime nous l’a présenté dans son cours.

J’ai utilisé l’authentification nickname pour accéder à la base de données comme dans le cours avec le code suivant:

let userCredentials = SyncCredentials.nickname(nickname)
        let url = URL(string: "https://-----.cloud.realm.io/")!
        SyncUser.logIn(with: userCredentials, server: url) { (user, _) in
            if let user = user{
                let realmUrl = URL(string: "realms://-----.cloud.realm.io/~/socio")!
                let syncConfig = SyncConfiguration(user: user, realmURL: realmUrl) ...etc

Je viens cependant de recevoir un mail de Realm qui annonce la suppression de ce type d’authentification “nickname” pour raison de sécurité… Soit je transforme mon application en utilisant “simple authentification” soit en utilisant “JWT Authentification”, soit elle devient inutilisable!!!

Le problème est que je n’ai plus d’aide du cours et que je ne comprends pas grand chose. J’ai essayé avec le code suivant (simple authentification) qui me paraissait plus facile d’accès mais rien ne fonctionne:

let auth_url = URL(string: "https://-----.cloud.realm.io/")!
        let creds    = SyncCredentials.usernamePassword(username: nickname, password: password, register: false)
        SyncUser.logIn(with: creds, server: auth_url) { (user, _) in
            if let user = user {
                // User is logged in
                let realmUrl = URL(string: "realms://-----.cloud.realm.io/~/socio")!
                let syncConfig = SyncConfiguration(user: user, realmURL: realmUrl)
                let realmConfig = Realm.Configuration( syncConfiguration: syncConfig)
                Realm.Configuration.defaultConfiguration = realmConfig
            }

Au secours!!! Si on peut m’aider un peu…
MERCI

Même problème ! Je crois que cela viens de “SyncCredentials” non ?

Je cherche sur les forums et les docs depuis 1 semaine … sans grande réussite !

Si quelqu’un trouve ?

@meyers.joel est-ce que Realm est installé via le package manager de Xcode 11 ? Si oui cela ne fonctionnera pas. Ce n’est pas intégré via le manager. Il faut passer par les Pods.

Christophe

Bonjour à tous et merci pour vos réponses.

J’avais bien installé Realm via les pods mais je ne trouvais pas jusqu’à il y a quelques jours…

J’ai créé un premier viewController d’accueil qui invite l’utilisateur à se connecter soit à une base existante, soit à une base à créer (donc qui le dirige soit vers loginAccount() soit vers createAccount() ) après lui avoir demandé un nom d’utilisateur (nickname) puis un mot de passe (mdp)

func loginAccount() {

    let authURL = URL(string: "https://myInstance.cloud.realm.io")!
    let usernameCredentials = SyncCredentials.usernamePassword(username: nickname, password: mdp, register: false)// **renvoie error si le compte n'existe pas**
    
    SyncUser.logIn(with: usernameCredentials, server: authURL, onCompletion: { [weak self](user, err) in
        
        **// Si le compte existe : vers base**
        if let user = user {
            
            let realmUrl = URL(string: "realms://myInstance.cloud.realm.io/~/xxxxx")!
            let syncConfig = SyncConfiguration(user: user, realmURL: realmUrl)
            let realmConfig = Realm.Configuration( syncConfiguration: syncConfig)
            Realm.Configuration.defaultConfiguration = realmConfig

           **// (exemple) Accéder à un viewController « menu »**

        }
            
            **// Si compte n'existe pas:**
        else{
            **print("DESOLE! Erreur compte...")**
                        }
        }
    )
    
}

**OU**

func createAccount() {
    
    
    let authURL = URL(string: "https://myInstance.cloud.realm.io")!
    let usernameCredentials = SyncCredentials.usernamePassword(username: nickname, password: mdp, register: true)// **renvoie error si le compte existe**
    
    SyncUser.logIn(with: usernameCredentials, server: authURL, onCompletion: { [weak self](user, err) in
        
        **// Si le compte n'existe pas: création base**
        if let user = user {
            
            let realmUrl = URL(string: "realms://myInstance.realm.io/~/xxxxx")!
            let syncConfig = SyncConfiguration(user: user, realmURL: realmUrl)
            let realmConfig = Realm.Configuration( syncConfiguration: syncConfig)
            Realm.Configuration.defaultConfiguration = realmConfig

// Le compte a été créé
// Accéder à un viewController « menu »

        }
            
        **// Si le compte existe :**
        else{
            **print("Erreur: le compte existe déjà...")**
            
        }
        }
    )
    
}

Cela marche bien pour moi… Je ne suis pas rentré dans le détail du code…

Par contre, je n’arrive toujours pas à utiliser SyncUser.configuration() pour remplacer SyncConfiguration(user : user, realmUrl : realmUrl) qui devrait bientôt devenir obsolète également (… is deprecated).

Si vous pouvez m’aider à encore avancer un peu…
Merci encore pour vos réponses

Joel

J’utilise ceci

let syncConfig = SyncUser.current!.configuration(realmURL: syncURL, fullSynchronization: true, enableSSLValidation: true)
                Realm.Configuration.defaultConfiguration = syncConfig

Merci mais j’avais déjà essayé ceci, c’est à dire remplacer dans mon code (précédent message):

let syncConfig = SyncConfiguration(user: user, realmURL: realmUrl)
let realmConfig = Realm.Configuration( syncConfiguration: syncConfig)
Realm.Configuration.defaultConfiguration = realmConfig

par:

let syncConfig = SyncUser.current!.configuration(realmURL: realmUrl, fullSynchronization: true, enableSSLValidation: true)
Realm.Configuration.defaultConfiguration = syncConfig

mais cela me retourne l’erreur suivante:

*** Terminating app due to uncaught exception ‹ RLMException ›, reason: ‹ +currentUser cannot be called if more that one valid, logged-in user exists. ›***

Je ne comprends pas vraiment pourquoi… il y a forcément quelque chose que je ne fais pas convenablement.

Un petit exemple d’authentification pourrait m’aider…

Merci

Joel

Essaye un « Erase all content and settings » de ton simulateur.

L’erreur indique que + de 1 utilisateur est connecté et que cela ne peut exister.