2011-12-19 27 views
15

Tôi đang sử dụng AFNetworking làm lớp mạng cho ứng dụng iPhone kết nối với máy chủ Rails sử dụng Devise để xác thực. Nếu tôi đăng nhập (với một cuộc gọi POST) cung cấp tên người dùng/mật khẩu thì sau đó bất kỳ GET tôi thực hiện là ok.AFNetworking and Cookies

Nếu tôi đóng ứng dụng (không chỉ nền) thì tất cả yêu cầu GET của tôi đều thất bại vì tôi đoán chúng không được xác thực.

Vì vậy, tôi đoán cookie được lưu trữ ở đâu đó; Có cách nào để lưu chúng trong NSUserDefaults hoặc một nơi nào đó như vậy để tránh đăng nhập vào tất cả các thời gian?

Trả lời

9

Cookie thực sự được lưu tự động trong suốt vòng đời của ứng dụng của bạn cho mọi yêu cầu tiếp theo trên một máy chủ cụ thể. Một chiến lược tốt sẽ được lưu trữ tên người dùng và mật khẩu trong chuỗi khóa hoặc trong NSUserDefaults như thế này:

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

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

Bạn có thể muốn sử dụng này kết hợp với AFHTTPClient để gửi thông tin của bạn cùng với mọi yêu cầu trong một tiêu đề Authorization HTTP .

+1

Cảm ơn bạn đã trả lời, vâng đây là những gì tôi làm để giữ cho thông tin cũ. Điều tôi muốn tránh là POST ban đầu để đăng nhập ở mỗi lần khởi động lại ứng dụng, tôi chỉ tự hỏi liệu thời gian tồn tại của cookie được AFNetworking xử lý có thể được mở rộng hay không. –

+26

Thực ra, vui lòng không lưu trữ tên người dùng và mật khẩu trong NSUserDefaults. Sử dụng keychain để thay thế. Apple phân phối một KeychainWrapper mà về cơ bản giống nhau, nhưng an toàn hơn. – eddieroger

75

Bạn không cần phải bận tâm với NSUserDefaults hoặc bất kỳ trình bao bọc keychain nào nếu bạn sử dụng NSURLCredential. Thật vậy NSURLCredentialđơn giản hơn nhiều để sử dụng, vì nó cho phép bạn lưu trữ cả tên người dùng và mật khẩu trong chuỗi trong hai dòng mã.

Mã của bạn sẽ là một cái gì đó như thế khi người dùng đăng nhập:

NSURLCredential *credential; 

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

Sau đó, mỗi lần ứng dụng được khởi động, bạn có thể kiểm tra xem người dùng của bạn đã được đăng nhập bằng cách tìm kiếm cho bất kỳ chứng chỉ trong để tự động đăng nhập lại dùng của bạn (nếu cần thiết):

NSURLCredential *credential; 
NSDictionary *credentials; 

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

bạn cũng cần để làm sạch các chứng chỉ khi người dùng muốn đăng xuất:

NSURLCredential *credential; 
NSDictionary *credentials; 

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

loginProtectionSpace được tạo một lần cho tất cả. Xin lưu ý rằng mã mẫu này giả định chỉ có một thông tin đăng nhập trong không gian này, thường là trường hợp trừ khi bạn quản lý một số tài khoản.

Dưới đây là một ví dụ về cách bạn sẽ tạo ra một 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

Mã để tạo NSURLProtectionSpace ở đâu? Tôi đã xem các tài liệu của Apple nhưng nó không thực sự rõ ràng với tôi về cách tạo tài liệu. Tôi đang đề cập đến "self.loginProtectionSpace" – user798719

+0

Tôi đoán ý của tôi là gì, làm cổng và tên máy chủ quan trọng hay là các không gian tên này? – user798719

+4

Tôi đã cập nhật câu trả lời của mình bằng ví dụ về cách tạo NSURLProtectionSpace. Vui lòng thay thế URL bằng chính bạn và cập nhật thông số phương thức xác thực bằng phương thức xác thực được máy chủ của bạn sử dụng. – Phil

Các vấn đề liên quan