ios - आईएसओ में NSURL कनेक्शन और मूल HTTP प्रमाणीकरण




iphone objective-c (5)

मुझे बुनियादी Authentication साथ प्रारंभिक GET HTTP request का आह्वान करने की आवश्यकता है। सर्वर पर अनुरोध पहली बार भेजा जाएगा और मेरे पास पहले से ही username & password इसलिए प्राधिकरण के लिए सर्वर से चुनौती की कोई आवश्यकता नहीं है।

पहला प्रश्न:

  1. क्या NSURLConnection को मूल Auth करने के लिए सिंक्रोनस के रूप में सेट किया जाना है? इस post के जवाब के मुताबिक, ऐसा लगता है कि यदि आप एसिंक रूट का विकल्प चुनते हैं तो आप मूल एथ नहीं कर सकते हैं।

  2. किसी को भी किसी भी नमूना कोड के बारे में पता है जो किसी चुनौती प्रतिक्रिया की आवश्यकता के बिना GET request पर बेसिक एथ को दिखाता है? ऐप्पल का दस्तावेज एक उदाहरण दिखाता है लेकिन सर्वर के बाद ही ग्राहक को चुनौती अनुरोध जारी किया गया है।

मैं एसडीके के नेटवर्किंग हिस्से में नया हूं और मुझे यकीन नहीं है कि इस काम को पाने के लिए मुझे किन अन्य वर्गों का उपयोग करना चाहिए। (मुझे NSURLCredential क्लास दिखाई देता है लेकिन ऐसा लगता है कि क्लाइंट ने सर्वर से अधिकृत संसाधन के लिए अनुरोध करने के बाद इसे केवल NSURLAuthenticationChallenge साथ उपयोग किया जाता है)।


क्या आप मुझे बता सकते हैं कि आपके उदाहरण कोड में एन्कोडिंग लाइन की लंबाई 80 तक सीमित करने का क्या कारण है? मैंने सोचा कि HTTP शीर्षलेखों की अधिकतम लंबाई 4k की तरह है (या शायद कुछ सर्वर उस से अधिक कुछ नहीं लेते हैं)। - जस्टिन गैल्ज़िक 2 9 दिसंबर को 17:29 बजे

यह 80 तक सीमित नहीं है, यह एनएसडीटा + बेस 64.h / एम में विधि base64EncodingWithLineLength विधि का एक विकल्प है, जहां आप अपनी एन्कोडेड स्ट्रिंग को कई लाइनों में विभाजित कर सकते हैं, जो अन्य अनुप्रयोगों जैसे एनएनटीपी ट्रांसमिशन के लिए उपयोगी है। मेरा मानना ​​है कि ट्विटर इंजन लेखक द्वारा 80 को चुना जाता है ताकि अधिकांश उपयोगकर्ता / पासवर्ड एन्कोड किए गए परिणाम को एक पंक्ति में समायोजित किया जा सके।


चूंकि NSData :: dataUsingEncoding को बहिष्कृत किया गया है (iOS 7.0), आप इस समाधान का उपयोग कर सकते हैं:

// Forming string with credentials 'myusername:mypassword'
NSString *authStr = [NSString stringWithFormat:@"%@:%@", username, password];
// Getting data from it
NSData *authData = [authStr dataUsingEncoding:NSASCIIStringEncoding];
// Encoding data with base64 and converting back to NSString
NSString* authStrData = [[NSString alloc] initWithData:[authData base64EncodedDataWithOptions:NSDataBase64EncodingEndLineWithLineFeed] encoding:NSASCIIStringEncoding];
// Forming Basic Authorization string Header
NSString *authValue = [NSString stringWithFormat:@"Basic %@", authStrData];
// Assigning it to request
[request setValue:authValue forHTTPHeaderField:@"Authorization"];

यदि आप अपने कनेक्शन के लिए GTMHTTPFetcher का उपयोग कर रहे हैं, तो मूल प्रमाणीकरण भी काफी आसान है। लाने के पहले आपको केवल fetcher को प्रमाण पत्र प्रदान करने की आवश्यकता है।

NSString * urlString = @"http://www.testurl.com/";
NSURL * url = [NSURL URLWithString:urlString];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];

NSURLCredential * credential = [NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession];

GTMHTTPFetcher * gFetcher = [GTMHTTPFetcher fetcherWithRequest:request];
gFetcher.credential = credential;

[gFetcher beginFetchWithDelegate:self didFinishSelector:@selector(fetchCompleted:withData:andError:)];

यदि आप पूरे एमजीटीविटरइंजिन को आयात नहीं करना चाहते हैं और आप एसिंक्रोनस अनुरोध नहीं कर रहे हैं तो आप http://www.chrisumbel.com/article/basic_authentication_iphone_cocoa_touch उपयोग कर सकते हैं

बेस 64 को उपयोगकर्ता नाम और पासवर्ड एन्कोड करने के लिए तो प्रतिस्थापित करें

NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodingWithLineLength:80]];

साथ में

NSString *encodedLoginData = [Base64 encode:[loginString dataUsingEncoding:NSUTF8StringEncoding]];

बाद

आपको निम्न फ़ाइल शामिल करने की आवश्यकता होगी

static char *alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

@implementation Base64
+(NSString *)encode:(NSData *)plainText {
    int encodedLength = (((([plainText length] % 3) + [plainText length]) / 3) * 4) + 1;
    unsigned char *outputBuffer = malloc(encodedLength);
    unsigned char *inputBuffer = (unsigned char *)[plainText bytes];

    NSInteger i;
    NSInteger j = 0;
    int remain;

    for(i = 0; i < [plainText length]; i += 3) {
        remain = [plainText length] - i;

        outputBuffer[j++] = alphabet[(inputBuffer[i] & 0xFC) >> 2];
        outputBuffer[j++] = alphabet[((inputBuffer[i] & 0x03) << 4) | 
                                     ((remain > 1) ? ((inputBuffer[i + 1] & 0xF0) >> 4): 0)];

        if(remain > 1)
            outputBuffer[j++] = alphabet[((inputBuffer[i + 1] & 0x0F) << 2)
                                         | ((remain > 2) ? ((inputBuffer[i + 2] & 0xC0) >> 6) : 0)];
        else 
            outputBuffer[j++] = '=';

        if(remain > 2)
            outputBuffer[j++] = alphabet[inputBuffer[i + 2] & 0x3F];
        else
            outputBuffer[j++] = '=';            
    }

    outputBuffer[j] = 0;

    NSString *result = [NSString stringWithCString:outputBuffer length:strlen(outputBuffer)];
    free(outputBuffer);

    return result;
}
@end

यहां तक ​​कि सवाल का उत्तर दिया गया है, मैं समाधान प्रस्तुत करना चाहता हूं, जिसके लिए बाहरी libs की आवश्यकता नहीं है, मुझे एक और धागे में मिला:

// Setup NSURLConnection
NSURL *URL = [NSURL URLWithString:url];
NSURLRequest *request = [NSURLRequest requestWithURL:URL
                                         cachePolicy:NSURLRequestUseProtocolCachePolicy
                                     timeoutInterval:30.0];

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
[connection release];

// NSURLConnection Delegates
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    if ([challenge previousFailureCount] == 0) {
        NSLog(@"received authentication challenge");
        NSURLCredential *newCredential = [NSURLCredential credentialWithUser:@"USER"
                                                                    password:@"PASSWORD"
                                                                 persistence:NSURLCredentialPersistenceForSession];
        NSLog(@"credential created");
        [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
        NSLog(@"responded to authentication challenge");    
    }
    else {
        NSLog(@"previous authentication failure");
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    ...
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    ...
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    ...
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    ...
}




nsurlconnection