2012-03-25 10 views
15

Ho un po 'di codice Mac che deve memorizzare, accedere e aggiornare le password per connettere gli utenti con un'API web. Il posto giusto dove mettere queste informazioni dovrebbe essere il portachiavi Mac, ma non sembra esserci un'interfaccia del cacao (vedi this answer) - è ancora corretto?Interfaccia Cocoa al portachiavi MacOS X

Ho visto Apple Keychain documentation e l'API sembra incredibilmente goffo. Posso archiviarlo e recuperare i record, ma qualsiasi cosa più complessa sembra richiedere un sacco di pensieri su cosa potrebbe andare storto (vedi this list of error codes).

Esiste un'interfaccia migliore per il portachiavi del Mac, a parte lo slogging attraverso il codice C? Il più vicino a cui sono arrivato è EMKeychain ma sembra che abbia bisogno di un po 'di lavoro (ad esempio nessun codice di gestione degli errori oltre a sputare sulla console).

risposta

10

Si consiglia di dare un'occhiata a SSKeychain. Funziona benissimo, codice fantastico.

+0

Questo potrebbe funzionare, anche se ho pensato che la password di internet sembra un po 'meglio di una partita per il mio setup rispetto al sistema di password generico. Immagino di poter codificare l'url nel "servizio" utilizzato da SSKeychain come identificatore. Se non c'è niente di meglio per i miei scopi, almeno questo è un punto di partenza se voglio mettere insieme un sistema attorno alle password di internet. – Noah

0

Risposta troppo rapida, ma sarebbe utile per un aiuto futuro. Qui di seguito è quello che ho fatto per salvare la password nel portachiavi di Mac

#pragma -mark Password save in Keychain 

-(NSURLProtectionSpace *)createProtectionSpaceForBasicAuthentication{ 

    NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] 
              initWithHost:@"http://yourURLHere" 
              port:1804 //add Your port here 
              protocol:@"http" //can be pass as nil 
              realm:nil 
              authenticationMethod:NSURLAuthenticationMethodHTTPBasic]; 
    return protectionSpace; 
} 

-(void)createCredentialForUsername:(NSString *)username Password:(NSString *)password{ 

    NSURLCredential *credentialObject; 
    credentialObject = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent]; 
    [[NSURLCredentialStorage sharedCredentialStorage] setCredential:credentialObject forProtectionSpace:[self createProtectionSpaceForBasicAuthentication]]; 
} 

Per salvare la password

- (IBAction)saveButtonClicked:(id)sender { 
    [self createCredentialForUsername:@"User_Name" Password:@"Your_Pass"]; 
} 

per il recupero della password

NSURLCredential *credential; 
NSDictionary *credentials; 
credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:[self createProtectionSpaceForBasicAuthentication]]; 
credential = [credentials.objectEnumerator nextObject]; 
    NSLog(@"Username: %@ and password %@", credential.user, credential.password); 

Quando si esegue l'applicazione per recuperare la password, otterremo il prompt di azione dell'utente per l'accesso portachiavi.