Accesso alla modellazione e autenticazione su un client mobile iOS

4

Sto per iniziare a lavorare su un V2 di un'applicazione mobile e mi piacerebbe adottare un approccio più incentrato sugli oggetti. Soprattutto perché penso che sia un codice più gestibile, ma un vantaggio secondario è la facilità di testabilità.

V1 dell'app è piuttosto incentrato sul controller. Login ViewController ha i suoi campi di login e raggiunge il back-end tramite AFNetworking, segnala errori se necessario e riceve un token che viene archiviato in modo sicuro per un uso successivo.

C'è sempre un solo utente. Quando l'utente si disconnette, tutti i dati locali vengono eliminati, quindi in sostanza l'utente corrente è "globale" e può essere nullo (è necessario un accesso) oppure no (non).

La situazione è complicata naturalmente dall'idea di scadenza del token. Sostanzialmente qualsiasi richiesta di rete (GET espliciti o POST asincroni ritardati) può fallire perché il token è scaduto e vogliamo che l'utente effettui nuovamente l'autenticazione.

Il modello V1 di una schermata di accesso all'avvio se non c'è un utente corrente non si estende facilmente a questo modello e, mi sembra, mi manca un oggetto in qualche modo che instrado tutto attraverso. Un Authenticator che fornisce un token o apre la schermata di login se non ne possiede uno.

Quindi potremmo fare qualcosa di simile: quando una richiesta fallisce, cancelliamo il token corrente e riproviamo la richiesta. La richiesta chiede all'autenticatore il token e l'autenticatore chiede all'utente.

O qualcosa.

Come potrebbe essere meglio modellato?

Mi sembra che il codice debba essere centralizzato, ma è difficile visto che le richieste vengono utilizzate in tutte le app. È quasi come un livello filtro necessario per gestire centralmente gli errori di autenticazione, ma altri errori / successi ovunque siano necessari (in un blocco riuscito / non riuscito).

    
posta alancfrancis 03.12.2013 - 14:59
fonte

1 risposta

2

Non vedo alcun problema con un metodo "centrato sul controller".

Iniziamo con un Root View Controller, proprietario di un oggetto "Utente".

- (void)viewDidAppear
{
    if (self.user && self.user.isAuthenticated) {
        [self showSensitiveData];
    } else {
        [self getAuthenticatedUserWithModal];
    }
}

Questo è abbastanza semplice, ma ovviamente se l'utente diventa non autenticato in qualsiasi momento, allora il tuo Root View Controller deve saperlo. Mi piace usare Reactive Cocoa, ma potresti farlo anche con KVO o delegazione:

- (void)authenitcationViewControllerDidFinishWithUser:(User *)user
{
    self.user = user;
    [self dismissViewControllerAnimated:YES completion:NULL];
}

- (void)setUser:(User *)
{
    _user = user;
    if (user) {
        @weakify(self);
        [RACObserve(self.user.isAuthenticated) subscribeNext:(id) x ^{
            @strongify(self);
            if(!self.user.isAuthenticated) {
                [self hideSensitiveData];
                [self getAuthenticatedUserWithModal];
            }
        }];
    }
}

In che modo l'utente sa se è autenticato o no? Apple suggerisce di inserire il codice di rete nei tuoi modelli . Se il tuo oggetto utente è responsabile della spedizione e della risposta alle richieste, puoi impostare la proprietà autenticata ogni volta che ricevi una richiamata.

    
risposta data 03.12.2013 - 16:13
fonte

Leggi altre domande sui tag