NSURLCredentialStorage sharedCredentialStorage не возвращает действительные учетные данные
У меня проблема с sharedCredentialStorage. Он не вернет ожидаемые учетные данные, даже имея все параметры пространства защиты (хост, порт,...) такие же, как те, что я установил ранее.
Код для установки defaultCredential:
NSURLCredential* credential = [NSURLCredential credentialWithUser:[self.username text] password:[self.password text] persistence:NSURLCredentialPersistencePermanent];
NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]initWithHost:@"localhost" port:0 protocol:NSURLProtectionSpaceHTTP realm:nil authenticationMethod:NSURLAuthenticationMethodDefault];
[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace];
После запуска этого фрагмента кода и перехода в окно GDB, результат для allCredentials (в sharedCredentialStorage) дает:
(lldb) po [[NSURLCredentialStorage sharedCredentialStorage] allCredentials]
(id) $10 = 0x07546d60 {
"<NSURLProtectionSpace: 0x7550530>" = {
lauro = "<NSURLCredential: 0x7573490>: lauro";
};
}
Это означает, что учетные данные были правильно добавлены в sharedCredentialStorage.
Но когда происходит операция http-запроса и появляется запрос аутентификации, и запускается этот код:
credential = [[NSURLCredentialStorage sharedCredentialStorage] defaultCredentialForProtectionSpace:[challenge protectionSpace]];
Ничто не возвращается в учетную переменную. У вас есть какие-либо подсказки, почему это происходит?
Выходные данные GDB дает:
(lldb) po [[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0]
(id) $13 = 0x0754c1b0 <NSURLProtectionSpace: 0x754c1b0>
(lldb) po [[[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0] host]
// Host for the credential @ sharedCredentialStorage
(id) $14 = 0x0a8b8000 localhost
(lldb) po [[[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0] port]
// Port for the credential @ sharedCredentialStorage (0 matches any)
(id) $15 = 0x00000000 <nil>
(lldb) po [[[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0] realm]
// Realm for the credential @ sharedCredentialStorage (nil matches any)
(id) $16 = 0x00000000 <nil>
(lldb) po [[[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0] authenticationMethod]
// Authentication method for the credential @ sharedCredentialStorage (this gets converted to HTTP basic)
(id) $17 = 0x0159c094 NSURLAuthenticationMethodDefault
(lldb) po [[[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0] protocol]
// Protocol for the credential @ sharedCredentialStorage
(id) $18 = 0x0159b504 http
(lldb) po [[challenge protectionSpace] host]
// Host for the credential @ challange
(id) $19 = 0x0754e6c0 localhost
(lldb) po [[challenge protectionSpace] port]
// Port for the credential @ challange
(id) $20 = 0x00000050 [no Objective-C description available]
// Realm for the credential @ challange
(lldb) po [[challenge protectionSpace] realm]
(id) $21 = 0x01bde844 <object returned empty description>
// Authentication method for the credential @ challange
(lldb) po [[challenge protectionSpace] authenticationMethod]
(id) $22 = 0x0159c094 NSURLAuthenticationMethodDefault
// And finally, the check again to see if we have credentials @ sharedCredentialStorage
(lldb) po [[NSURLCredentialStorage sharedCredentialStorage] allCredentials]
(id) $25 = 0x0756f2b0 {
"<NSURLProtectionSpace: 0x7574a80>" = {
lauro = "<NSURLCredential: 0x7574b00>: lauro";
};
}
Еще одна вещь, даже если я использую некоторую строку для области (и устанавливаю ее правильно также в моем веб-сервисе REST), она не работает.
1 ответ
Когда вы получаете вызов, порт, предоставленный в области защиты, вероятно, 80 (или 443). Когда вы сохраняете учетные данные, вы даете порт 0. Установите правильный порт (80 для http, 443 для https, если только вы не знаете, что сервер, к которому вы подключаетесь, не использует порты по умолчанию - ваш вывод lldv, кажется, покажи порт 50?) и попробуй.