2012-03-25 16 views
15

Mam trochę kodu Mac, który musi przechowywać, uzyskiwać dostęp i aktualizować hasła, aby łączyć użytkowników za pomocą web API. Odpowiednim miejscem na umieszczenie tej informacji powinien być Mac Keychain, ale nie wydaje się, aby interfejs kakao (patrz this answer) - czy to nadal jest poprawne?Interfejs kakao na MacOS X Keychain

Przyjrzałem się numerowi Apple Keychain documentation, a interfejs API wydaje się niewiarygodny. Mogę przechowywać i pobierać rekordy, ale wszystko, co wydaje się bardziej złożone, wymaga wiele przemyśleń na temat tego, co może pójść nie tak (patrz: this list of error codes).

Czy istnieje lepszy interfejs do keychaina Maca, oprócz przeszukiwania kodu C? Najbliższy, do którego przyszedłem, jest EMKeychain, ale wydaje się, że potrzebuje trochę pracy (na przykład kod obsługi błędów poza pluciem na konsolę).

Odpowiedz

10

Powinieneś rzucić okiem na SSKeychain. Działa świetnie, świetny kod.

+0

To może zadziałać, chociaż wydawało mi się, że hasło do Internetu wydaje się być nieco lepsze w porównaniu z moimi ustawieniami niż ogólny system haseł. Chyba mogę zakodować adres URL w "usłudze", której SSKeychain używa jako identyfikatora. Jeśli nie ma nic lepszego dla moich celów, to przynajmniej jest to punkt wyjścia, jeśli chcę stworzyć system wokół haseł internetowych. – Noah

0

Zbyt późna odpowiedź, ale byłaby dobra dla przyszłej pomocy. Poniżej jest to, co zrobiłem, aby zapisać hasło w pęku kluczy z 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]]; 
} 

Do zapisywania hasła

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

do pobierania hasła

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

Kiedy możemy uruchomić aplikację do pobierania hasła otrzymamy monit użytkownika o dostęp do pęku kluczy.