2011-12-19 4 views
15

Я использую AFNetworking в качестве сетевого уровня для своего iPhone-приложения, которое подключается к серверу Rails, который использует Devise для аутентификации. Если я вхожу (с вызовом POST), предоставляя имя пользователя/пароль, то после этого любой GET, который я выполняю, в порядке.AFNetworking and Cookies

Если я закрываю приложение (а не только фон), то все мои запросы GET терпят неудачу, потому что я думаю, что они не аутентифицированы.

Таким образом, я полагаю, что куки хранятся где-то; есть ли способ сохранить их в NSUserDefaults или где-то в этом роде, чтобы избежать регистрации во все время?

ответ

9

Файлы cookie действительно автоматически сохраняются в течение всего срока действия вашего приложения для любых последующих запросов на конкретном сервере. Хорошая стратегия будет хранить имя пользователя и пароль в связке ключей или в NSUserDefaults вроде этого:

// Setting 
[[NSUserDefaults standardDefaults] setObject:username forKey:@"username"]; 
[[NSUserDefaults standardDefaults] synchronize]; 

// Getting 
NSString *username = [[NSUserDefaults standardDefaults] objectForKey:@"username"]; 

Вы можете использовать это в сочетании с AFHTTPClient для отправки учетных данных вместе с каждым запросом в заголовке в Authorization HTTP ,

+1

Спасибо за ответ, да это то, что мне делать, чтобы сохранить старые полномочия. То, что я хотел бы избежать, это начальный POST для входа в систему при каждом перезапуске приложения, мне просто интересно, можно ли продлить жизнь печенья, обрабатываемого AFNetworking. –

+26

На самом деле, пожалуйста, не храните имена пользователей и пароли в NSUserDefaults. Вместо этого используйте брелок. Apple распространяет KeychainWrapper, который делает в основном одно и то же, но более надежно. – eddieroger

75

При использовании NSURLCredential вам не нужно беспокоиться о NSUserDefaults или любой оболочке связки ключей. Действительно NSURLCredentialгораздо проще в использовании, так как он позволяет вам хранить как имя пользователя, так и пароль в цепочке ключей в двух строках кода.

Ваш код будет что-то подобное, когда пользователь вошел в систему:

NSURLCredential *credential; 

credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent]; 
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace]; 

Затем, каждый раз, когда приложение запускается, вы можете проверить, был ли ваш пользователь уже вошел в систему с помощью функции поиска для любого верительных в для того, чтобы автоматически войти обратно вашего пользователя (если необходимо):

NSURLCredential *credential; 
NSDictionary *credentials; 

credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace]; 
credential = [credentials.objectEnumerator nextObject]; 
NSLog(@"User %@ already connected with password %@", credential.user, credential.password); 

Кроме того, необходимо очистить верительных, когда пользователь хочет выйти:

NSURLCredential *credential; 
NSDictionary *credentials; 

credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace]; 
credential = [credentials.objectEnumerator nextObject]; 
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:credential forProtectionSpace:self.loginProtectionSpace]; 

loginProtectionSpace создано один раз для всех. Пожалуйста, обратите внимание, что этот пример кода предполагает, что в этом пространстве есть только один учетный код, что обычно имеет место, если вы не управляете несколькими учетными записями.

Вот пример того, как вы бы создать NSURLProtectionSpace:

NSURL *url = [NSURL URLWithString:@"http://www.example.com"]; 
self.loginProtectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url.host 
                    port:[url.port integerValue] 
                   protocol:url.scheme 
                   realm:nil 
                authenticationMethod:NSURLAuthenticationMethodHTTPDigest]; 
+0

Где код для создания NSURLProtectionSpace? Я посмотрел документы Apple, но мне не совсем ясно, как его создать. Я имею в виду «self.loginProtectionSpace» – user798719

+0

Я предполагаю, что я имею в виду, имеет ли значение порт и имя хоста или эти пространства имен? – user798719

+4

Я обновил свой ответ на примере того, как создать NSURLProtectionSpace. Пожалуйста, замените URL-адрес своим собственным и обновите параметр метода проверки подлинности методом проверки подлинности, используемым вашим сервером. – Phil