iOS8: Integrare il Touch ID e impronte digitali nelle proprie app

Nel settembre del 2013, Apple ha presentato l’ultimo iPhone, con una serie di miglioramenti hardware. La caratteristica più innovativa di iPhone 5s erano una banda di metallo sottile che circonda il tasto home, un sensore di impronte digitali chiamato touch ID. Un anno e iOS 8 hanno introdotto un nuovo framework che dà agli sviluppatori la possibilità di utilizzare il sensore di impronte digitali.

iPhone-5s-Touch-ID

Il framework di autenticazione locale (Local Authentication framework) fornisce metodi per richiedere all’utente di autenticarsi. È possibile utilizzare questo come accesso per la vostra applicazione o usarlo solo per proteggere i dati sensibili all’interno di un app. In questo tutorial, vi spiegherò le opzioni disponibili per voi, quali dati si possono ottenere dal dispositivo, e costruiremo un applicazione di esempio.

Questo tutorial richiede Xcode 6 per creare il progetto e avrete bisogno di un dispositivo con touch ID per verificare l’applicazione di esempio che creeremo.

Considerazioni sulla sicurezza

La preoccupazione più grande con il sensore di impronte digitali è che la privacy delle utenti è fondamentalmente violato. Se viene rivelata la password, è possibile modificarla con una nuova e una persona malintenzionata non sarebbe più in grado di usarla per accedere ai dati. Se la tua impronta digitale, o la sua rappresentazione matematica, è esposta, non si può cambiare così facilmente.

Il Local Authentication framework gestisce tutto il lavoro pesante della verifica. Quando si lavora con il Touch ID, è importante sapere che non rivela i dettagli sull’utente e nessun trasferimento dei dati dal dispositivo a server esterni viene effettuato. Tuttavia, gli sviluppatori possono utilizzare il framework per verificare se un utente è autorizzato a utilizzare l’applicazione.

Se si ha familiarità con OAuth, si può vedere somiglianze nel modo in cui l’autenticazione viene gestita, si chiede una terza parte per verificare l’identità di un utente, se vi fidate del terzo, è possibile utilizzare la loro risposta al posto di chiedere credenziali direttamente dall’utente.

LAContext

Il cuore del framework di autenticazione locale è il LAContext classe. Gli sviluppatori possono utilizzare un’istanza di LAContext per valutare una politica di sicurezza. Al momento della scrittura, c’è un solo criterio. Essa controlla, utilizzando il sensore Touch ID, che la persona da autenticare è il proprietario del dispositivo. In futuro ci potranno essere altri criteri di protezione. Ad esempio, Apple potrebbe introdurre un ruolo privilegiato che sarà solo in grado di accedere a determinate risorse.

Se il framework non è in grado di autenticare, si genera un errore. Ci sono diversi motivi per cui un dispositivo non sia in grado di autenticare.

  • LAErrorTouchIDNotAvailable Il dispositivo non dispone di un sensore di impronte digitali.
  • LAErrorPasscodeNotSet Non è impostata sul dispositivo, il che significa che il codice di accesso è disabilitato.
  • LAErrorTouchIDNotEnrolled C’è un codice di accesso impostato, ma il dispositivo non è stato configurato con le impronte digitali.

Se viene generato un errore con uno dei codici di errore di cui sopra, allora avete bisogno di fornire qualche altro metodo agli utenti di autenticarsi. A questo punto, non si può fare affidamento esclusivamente sul touch ID.

Creiamo una applicazione di esempio per imparare come possiamo fare uso del framework di autenticazione locale.

Progetto d’esempio

Aprire Xcode e selezionare Nuovo > Progetto … dal menu File. Scegli Single View Application dall’elenco dei modelli di applicazione iOS e fare clic su Avanti. Immettere un nome per il progetto, ho chiamato il mio Auth. Inserisci il nome della tua organizzazione, identificativo aziendale, e il prefisso della classe. Scegliere iPhone dall’elenco Dispositivi, fare clic su Avanti e scegliere una posizione per salvare il progetto.

Fare clic ViewController.h e definire una nuova azione, authenticateButtonTapped , che attiverà il processo di autenticazione. L’interfaccia del ViewController dovrebbe assomigliare a questa:

[code lang=”obj-c”]

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

– (IBAction)authenticateButtonTapped:(id)sender;

@end

[/code]

Aprire Main.storyboard e trascinare un pulsante sulla View. Modificare l’etichetta del pulsante ed inserire Autentica.

add_button

 

Fare clic con il pulsante per visualizzare la Connections Inspector. Clic sul Più sulla sinistra dell’evento touch UP Inside e selezionare il controller che contiene il pulsante. Un altro menu apparirà in cui è possibile selezionare l’azione che abbiamo dichiarato un momento fa.

touch_up_inside

Passa al ViewController.m per implementare il metodo authenticateButtonTapped. Nella parte superiore del file aggiungere la seguente istruzione import per il framework di autenticazione.

[code lang=”obj-c”]
#import <LocalAuthentication/LocalAuthentication.h>
[/code]

Nel metodo authenticateButtonTapped, creiamo un contesto per determinare se siamo in grado di valutare la politica LAPolicyDeviceOwnerAuthenticationWithBiometrics, altrimenti mostriamo un messaggio di errore.

[code lang=”obj-c”]
– (IBAction)authenticateButtonTapped:(id)sender {
LAContext *context = [[LAContext alloc] init];

NSError *error = nil;

if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
// Autentica utente

} else {

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Il tuo dispositivo non è in grado di autenticare usando TouchID."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];

}
}
[/code]

Se l’oggetto LAContext è in grado di autenticare usando il Touch ID, quindi cerchiamo di verificare l’identità dell’utente. Se non viene generato nessun errore, diciamo che l’utente è il proprietario del dispositivo. L’implementazione finale del metodo è mostrato sotto.

[code lang=”obj-c”]
– (void)authenicateButtonTapped:(id)sender {
LAContext *context = [[LAContext alloc] init];

NSError *error = nil;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:@"Sei il proprietario?"
reply:^(BOOL success, NSError *error) {

if (error) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"C’è stato un problema nel verificare la tua identità."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
return;
}

if (success) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Success"
message:@"Sei il proprietario!"
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];

} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Non sei il proprietario :("
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
}

}];

} else {

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Il tuo dispositivo non è in grado di autenticare usando TouchID."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];

}
}
[/code]

Build and Run

Eseguire l’applicazione su un dispositivo fisico con un sensore di impronte digitali e toccare il pulsante per l’autenticazione. Se il dispositivo ha il supporto Touch ID,  l’applicazione richiederà di autenticarsi. Se si mette il dito sul sensore, l’applicazione dovrebbe dirvi se sei il proprietario del dispositivo oppure no.

final_app

Conclusione

In questo tutorial, abbiamo guardato il Local Authentication framework introdotto in iOS 8 controllando l’identità dell’utente, la classe LAContext consente agli utenti di identificare se stessi senza fornire dati sensibili direttamente l’applicazione.