IMT2000 3GPP - iOS에서의 NSURL 접속 및 기본 HTTP 인증
이니셜을 호출해야 합니다.GET HTTP request
베이직과 함께Authentication
. 서버로 요청이 전송되는 것은 이번이 처음일 것이고 나는 이미 그것을 가지고 있습니다.username & password
따라서 서버에서 승인을 요청할 필요가 없습니다.
첫번째 질문:
요?
NSURLConnection
기본 인증을 하려면 동기화로 설정해야 합니까?이 게시물의 답변을 보면 비동기 경로를 선택하면 베이직 인증을 할 수 없는 것 같습니다.Basic Auth on a를 설명하는 샘플 코드를 아는 사람.
GET request
도전적인 답변이 필요 없는 경우?애플의 문서는 서버가 클라이언트에게 도전 요청을 한 후에야 예시를 보여줍니다.
SDK의 네트워킹 부분은 처음이라 다른 클래스 중에서 어떤 것을 사용해야 이것이 작동되는지 잘 모르겠습니다.(그렇습니다.NSURLCredential
수업을 하지만 그것은 오직 사용하는것 같습니다.NSURLAuthenticationChallenge
클라이언트가 서버로부터 승인된 리소스를 요청한 후).
저는 MGTwitterEngine과 비동기 연결을 사용하고 있으며, 이는 에서 권한을 설정합니다.NSMutableURLRequest
(theRequest
) 다음과 같습니다.
NSString *authStr = [NSString stringWithFormat:@"%@:%@", [self username], [self password]];
NSData *authData = [authStr dataUsingEncoding:NSASCIIStringEncoding];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodingWithLineLength:80]];
[theRequest setValue:authValue forHTTPHeaderField:@"Authorization"];
저는 이 방법이 도전 루프를 거쳐야 한다고 생각하지 않지만 틀릴 수도 있습니다.
질문에 대한 답도 있지만, 저는 외부의 입김을 필요로 하지 않는 해결책을 제시하고 싶습니다. 다른 스레드에서 발견했습니다.
// 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 {
...
}
제3자가 관련되지 않은 자세한 답변은 다음과 같습니다.
여기에서 확인하시기 바랍니다.
//username and password value
NSString *username = @“your_username”;
NSString *password = @“your_password”;
//HTTP Basic Authentication
NSString *authenticationString = [NSString stringWithFormat:@"%@:%@", username, password]];
NSData *authenticationData = [authenticationString dataUsingEncoding:NSASCIIStringEncoding];
NSString *authenticationValue = [authenticationData base64Encoding];
//Set up your request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.your-api.com/“]];
// Set your user login credentials
[request setValue:[NSString stringWithFormat:@"Basic %@", authenticationValue] forHTTPHeaderField:@"Authorization"];
// Send your request asynchronously
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *responseCode, NSData *responseData, NSError *responseError) {
if ([responseData length] > 0 && responseError == nil){
//logic here
}else if ([responseData length] == 0 && responseError == nil){
NSLog(@"data error: %@", responseError);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Error accessing the data" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
[alert show];
[alert release];
}else if (responseError != nil && responseError.code == NSURLErrorTimedOut){
NSLog(@"data timeout: %@”, NSURLErrorTimedOut);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"connection timeout" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
[alert show];
[alert release];
}else if (responseError != nil){
NSLog(@"data download error: %@”,responseError);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"data download error" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
[alert show];
[alert release];
}
}]
이에 대한 당신의 의견을 알려주시기 바랍니다.
감사해요.
MGTwitterEngine 전체를 가져오기를 원하지 않고 비동기 요청을 하지 않을 경우 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
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"];
연결을 위해 GTMHTTPF 등을 사용하는 경우 기본 인증도 상당히 용이합니다.가져오기를 시작하기 전에 페처에 자격 증명을 제공하기만 하면 됩니다.
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:)];
예제 코드에서 인코딩 라인 길이를 80으로 제한한 이유가 무엇인지 알려주시겠습니까?HTTP 헤더의 최대 길이는 4k 정도라고 생각했습니다(또는 일부 서버는 그보다 더 오래 걸리지 않을 수도 있습니다).– 저스틴 갈지치 2009년 12월 29일 17:29
이것은 80으로 제한되는 것이 아니라 NSData+Base64.h/m에서 메서드 base64EncodingWithLineLength의 옵션으로, 인코딩된 문자열을 여러 줄로 분할할 수 있으므로 nntp 전송과 같은 다른 응용 프로그램에 유용합니다.트위터 엔진 작성자는 대부분의 사용자/비밀번호 인코딩 결과를 한 줄에 수용할 수 있을 정도의 길이로 80을 선택했다고 생각합니다.
AF네트워킹(오픈소스)을 이용하시면 되고, 여기에 저에게 도움이 된 코드가 있습니다.이 코드는 기본 인증과 함께 파일을 보냅니다.url, 이메일, 비밀번호만 변경하면 됩니다.
NSString *serverUrl = [NSString stringWithFormat:@"http://www.yoursite.com/uploadlink", profile.host];
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:serverUrl parameters:nil error:nil];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
// Forming string with credentials 'myusername:mypassword'
NSString *authStr = [NSString stringWithFormat:@"%@:%@", email, emailPassword];
// 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"];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
NSURL *filePath = [NSURL fileURLWithPath:[url path]];
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:^(NSProgress * _Nonnull uploadProgress) {
// This is not called back on the main queue.
// You are responsible for dispatching to the main queue for UI updates
dispatch_async(dispatch_get_main_queue(), ^{
//Update the progress view
LLog(@"progres increase... %@ , fraction: %f", uploadProgress.debugDescription, uploadProgress.fractionCompleted);
});
} completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"Success: %@ %@", response, responseObject);
}
}];
[uploadTask resume];
언급URL : https://stackoverflow.com/questions/1973325/nsurlconnection-and-basic-http-authentication-in-ios
'bestsource' 카테고리의 다른 글
Ubuntu 14.04에 mysqldump 설치 (0) | 2023.10.21 |
---|---|
C의 stdio에서 int를 받으려면 어떻게 해야 합니까? (0) | 2023.10.21 |
Git - 로컬에서 일부 파일을 삭제했습니다. 원격 저장소에서 파일을 가져오려면 어떻게 해야 합니까? (0) | 2023.10.21 |
워드프레스 커스텀 필드 입력 텍스트를 qTranslate X로 번역 가능하게 만드는 방법은? (0) | 2023.10.21 |
일반 암호로 WordPress 해시 암호 확인 (0) | 2023.10.21 |