API Callback Using IOS with Authentication

I am working on an application that uses a calm API call using the preashop API. I am new to iOS. I encoded the same method in android, like:

InputStream is = null; try { DefaultHttpClient client = new DefaultHttpClient(); /* adding credentials as it is RESTful call */ String username = "xyz"; String password = ""; client.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),new UsernamePasswordCredentials(username, password)); // HTTP get request HttpGet get = new HttpGet("http://www.example.com/api/"); HttpResponse responseGet; responseGet = client.execute(get); is = responseGet.getEntity().getContent(); } catch (ClientProtocolException e) { Log.e("HTTP Request","Client Protocol exception" ); } catch (IOException e) { Log.e("HTTP Request","IO exception" ); } 

It works great for Android. For IOS, I used this encoding, but I do not receive data from the server.

 NSString *userName = @"XYZ"; NSString *password = @""; //setting the string of the url taking from appliance IP. NSString *urlString = @"http://www.example.com/api/"; NSMutableURLRequest *request= [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"GET"]; NSString *str1 = [NSString stringWithFormat:@"%@:%@",userName,password]; NSLog(@" str1 %@", str1); [request addValue:[NSString stringWithFormat:@"Basic %@",str1] forHTTPHeaderField:@"Authorization"]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *str = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"str: %@", str); 

please tell me what I am doing wrong and provide any solution.

Thanks!

+6
source share
3 answers

You can create a URL string this way and it should work: -

 NSString *str1 = [NSString stringWithFormat:@"http://%@:%@@www.example.com/api",userName,password]; 

No need to use HTTP header fields which I consider

+5
source

The username and password must be encoded using Base64 encoding when using basic HTTP authentication.

From the Wikipedia article on this subject :

Client side

When a user agent wants to send server authentication, it can use the authorization header.

The authorization header is constructed as follows: [6] The username and password are combined in the string "username: password"

The resulting string literal is then encoded using Base64

Then the authorization method and a space are introduced, that is, the "base" encoded string. For example, if the user agent uses "Aladin" as the username and "sesam open" as the password, then the header is formed as follows:

 Authorization: Basic QWxhZGluOnNlc2FtIG9wZW4= 

See the fixed code:

 [...] NSString *str1 = [NSString stringWithFormat:@"%@:%@",userName,password]; NSString *encodedString = [self stringByBase64EncodingWithString:str1]; [request addValue:[NSString stringWithFormat:@"Basic %@",encodedString] forHTTPHeaderField:@"Authorization"]; [...] - (NSString *)stringByBase64EncodingWithString:(NSString *)inString { NSData *data = [NSData dataWithBytes:[inString UTF8String] length:[inString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]]; NSUInteger length = [data length]; NSMutableData *mutableData = [NSMutableData dataWithLength:((length + 2) / 3) * 4]; uint8_t *input = (uint8_t *)[data bytes]; uint8_t *output = (uint8_t *)[mutableData mutableBytes]; for (NSUInteger i = 0; i < length; i += 3) { NSUInteger value = 0; for (NSUInteger j = i; j < (i + 3); j++) { value <<= 8; if (j < length) { value |= (0xFF & input[j]); } } static uint8_t const base64EncodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; NSUInteger idx = (i / 3) * 4; output[idx + 0] = base64EncodingTable[(value >> 18) & 0x3F]; output[idx + 1] = base64EncodingTable[(value >> 12) & 0x3F]; output[idx + 2] = (i + 1) < length ? base64EncodingTable[(value >> 6) & 0x3F] : '='; output[idx + 3] = (i + 2) < length ? base64EncodingTable[(value >> 0) & 0x3F] : '='; } return [[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding]; } 
+3
source
  -(void)getApiCall:(NSString *)urlString response:(NSMutableArray *)response{ NSString *url= urlString; NSURL * serviceUrl = [NSURL URLWithString:url]; NSMutableURLRequest * serviceRequest = [NSMutableURLRequest requestWithURL:serviceUrl cachePolicy:nil timeoutInterval:10.0]; [serviceRequest setValue:@"Application/json" forHTTPHeaderField:@"Content-type"]; [serviceRequest setHTTPMethod:@"GET"]; NSURLResponse *serviceResponse; NSError *serviceError; NSData *responseData = [NSURLConnection sendSynchronousRequest:serviceRequest returningResponse:&serviceResponse error:&serviceError]; NSLog(@"REQUEST ==== >>>> %@",serviceUrl); NSLog(@"RESPONSE ==== >>>> %@",responseData); if (responseData != nil){ [self parseGetData:responseData responseArray:response]; } else{ } } -(void)parseGetData:(NSData *)response responseArray:(NSMutableArray *)responseArray { id jsonObject = Nil; NSString *charlieSendString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; NSLog(@"ResponseString ==== >>>> %@",charlieSendString); if (response==nil) { NSLog(@"ERROR IN GET API....!!!!"); }else{ NSError *error = nil; jsonObject =[NSJSONSerialization JSONObjectWithData:response options:kNilOptions error:&error]; if (error) { NSLog(@"%@",error); } else { NSError *error = Nil; jsonObject =[NSJSONSerialization JSONObjectWithData:response options:kNilOptions error:&error]; if ([jsonObject isKindOfClass:[NSArray class]]) { NSLog(@"Probably An Array"); } else { NSLog(@"Probably A Dictionary"); NSDictionary *jsonDictionary=(NSDictionary *)jsonObject; NSLog(@"jsonDictionary %@",[jsonDictionary description]); if (jsonDictionary) { [responseArray addObject:jsonDictionary]; } } } } } 
0
source

Source: https://habr.com/ru/post/926823/


All Articles